对于varargs参数,@ Nullable注释在何处引用?

时间:2015-09-01 08:39:26

标签: java-8 type-annotation

以下签名:

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

@Nullable注释在哪里引用?对阵列或其元素?是否有可能注释两个选项(数组/元素)?

Java 7和Java 8(类型注释)之间是否存在差异?

1 个答案:

答案 0 :(得分:10)

由于仍然没有标准@Nullable注释,因此您使用的是第三方库的注释,因此它取决于它的声明方式。 Pre-Java 8注释不是类型注释,因为旧版本中不存在该功能。因此,使用这些注释,您始终注释参数而不是其类型。这通常被框架解释为“参数可以是null”,这将是数组引用,尽管框架可能会特别处理varargs,但没有标准强制要求特定行为。

当您使用真正的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类型注释兼容的最新检查器框架实现。