java-8 - 如果是 varargs 参数,@Nullable 注释引用哪里?

标签 java-8 type-annotation

对于以下签名:

public static String format(final String pattern, final @Nullable Object... arguments)

@Nullable 注解指的是哪里?到数组还是到它的元素?是否可以注释两个选项(数组/元素)?

Java 7 和 Java 8(类型注释)之间有区别吗?

最佳答案

由于仍然没有标准的@Nullable注释,您正在使用第三方库的注释,因此这取决于它的声明方式。 Java 8 之前的注释不是类型注释,因为旧版本中不存在该功能。因此,使用这些注释,您总是注释参数而不是其类型。框架通常将其解释为“参数可以为 null”,即数组引用,尽管框架可能会特殊对待可变参数,但没有标准强制执行特定行为。

当您使用真正的 Java 8 类型注释(即带有 @Target(ElementType.TYPE_USE) 的注释)时,使用普通数组声明可以最好地解释结果:

@Nullable ElementType  []

声明一个@Nullable ElementType数组,读取可为空的元素

ElementType  @Nullable []

声明一个可为空的数组类型。

因此,声明

public static String format(final String pattern, final @Nullable Object... arguments)

意味着元素可以为null,而

public static String format(final String pattern, final Object @Nullable... arguments)

声明数组引用可能为null。当然,您可以将它们组合起来声明两者(元素或数组本身)都可以为null

public static String format(String pattern, @Nullable Object @Nullable ... arguments)

如上所述,要使用这些选项,您需要一个真正声明为 Java 8 类型注释的注释类型。然后,为了强制执行所描述的语义,您需要一个与 Java 8 类型注释兼容的最新检查器框架实现。

关于java-8 - 如果是 varargs 参数,@Nullable 注释引用哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32327134/

相关文章:

enums - 与数组上的迭代相比,使用 Arrays.stream() 是否有任何性能优势?

Swift 对 Type Annotation 的定义

python - 如何在Python3.7/3.8中使用通用namedtuple?

java - Java 8 Streams 中使用谓词对象的动态函数调用

java - 使用java8流来防止重复代码

java - 并行流 Java 8 的 CPU 核心数

java - 转换 Java Stream 并返回减少的值

swift - 如何将Character类型注解转成String类型注解?

python - 如何在 Python 3.7+ 中注入(inject)类变量注解?