是否有隐式扩展到泛型类型的可空注释?

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