是否有隐式扩展到泛型类型的可空注释?
Are there any nullable annotations that implicitly extend to generic types?
我在一个 Java 项目中工作,最近我开始为方法参数和 return 值添加可为 null 的注释。我想知道是否有任何注释可以添加到参数中,以便它也涵盖泛型类型。现在我有类似的案例:
Map<String, String> someMethod(Map<String, Map<String, String>> arg) {
...
}
即变成:
@NotNull
Map<@NotNull String, @NotNull String> someMethod(@NotNull Map<@NotNull String, @NotNull Map<@NotNull String, @NotNullString>> arg) {
...
}
显然,这变得难以阅读。我对 Java 注释的内部结构不是很熟悉,所以也许这是不可能的?
我不知道所有可能的 NotNull 注释。如果他们中的任何一个允许ElementType.TYPE_PARAMETER
,那么他们应该能够注释泛型。
如果没有,就实现下面的注解:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE_PARAMETER)
public @interface NotNull {}
如果您想在泛型以外的其他方面使用此注释,请添加更多元素类型。
如果你想在运行时通过反射使用注释,那么你必须将 RetentionPolicy 更改为 RUNTIME
.
可以使用合适的默认注释来减少空注释的数量。
以下适用于来自 org.eclipse.jdt.annotation_2.x
的注释:
特别是 @org.eclipse.jdt.annotation.NonNullByDefault
能够影响不同位置的类型,包括类型参数。
所以如果你写:
@NonNullByDefault
Map<String, String> someMethod(Map<String,Map<String,String>> arg) { ...
这确实会被解释为
@NonNull Map<@NonNull String, @NonNull String> someMethod(@NonNull Map<@NonNull String, @NonNull Map<@NonNull String, @NonNull String>> arg) {
它甚至可能 fine-tune @NonNullByDefault
的效果,它可以应用于单个方法,或整个 类、包或模块。
如果签名仍然包含一些可为 null 的类型,则需要将它们单独注释为 @Nullable
以覆盖默认值,但这些异常应该比非 null 类型少得多。请注意,@NonNull
和 @Nullable
都可以附加到所有相关位置的类型,同样包括类型参数。
可以找到有关 Eclipse 如何解释泛型感知空注释的一般文档 in the online help。
我在一个 Java 项目中工作,最近我开始为方法参数和 return 值添加可为 null 的注释。我想知道是否有任何注释可以添加到参数中,以便它也涵盖泛型类型。现在我有类似的案例:
Map<String, String> someMethod(Map<String, Map<String, String>> arg) {
...
}
即变成:
@NotNull
Map<@NotNull String, @NotNull String> someMethod(@NotNull Map<@NotNull String, @NotNull Map<@NotNull String, @NotNullString>> arg) {
...
}
显然,这变得难以阅读。我对 Java 注释的内部结构不是很熟悉,所以也许这是不可能的?
我不知道所有可能的 NotNull 注释。如果他们中的任何一个允许ElementType.TYPE_PARAMETER
,那么他们应该能够注释泛型。
如果没有,就实现下面的注解:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE_PARAMETER)
public @interface NotNull {}
如果您想在泛型以外的其他方面使用此注释,请添加更多元素类型。
如果你想在运行时通过反射使用注释,那么你必须将 RetentionPolicy 更改为 RUNTIME
.
可以使用合适的默认注释来减少空注释的数量。
以下适用于来自 org.eclipse.jdt.annotation_2.x
的注释:
特别是 @org.eclipse.jdt.annotation.NonNullByDefault
能够影响不同位置的类型,包括类型参数。
所以如果你写:
@NonNullByDefault
Map<String, String> someMethod(Map<String,Map<String,String>> arg) { ...
这确实会被解释为
@NonNull Map<@NonNull String, @NonNull String> someMethod(@NonNull Map<@NonNull String, @NonNull Map<@NonNull String, @NonNull String>> arg) {
它甚至可能 fine-tune @NonNullByDefault
的效果,它可以应用于单个方法,或整个 类、包或模块。
如果签名仍然包含一些可为 null 的类型,则需要将它们单独注释为 @Nullable
以覆盖默认值,但这些异常应该比非 null 类型少得多。请注意,@NonNull
和 @Nullable
都可以附加到所有相关位置的类型,同样包括类型参数。
可以找到有关 Eclipse 如何解释泛型感知空注释的一般文档 in the online help。