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

Gus*_*ave 3 java-8 type-annotation

对于以下签名:

public static String format(final String pattern, final @Nullable Object... arguments)
Run Code Online (Sandbox Code Playgroud)

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

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

Hol*_*ger 11

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

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

@Nullable ElementType  []
Run Code Online (Sandbox Code Playgroud)

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

ElementType  @Nullable []
Run Code Online (Sandbox Code Playgroud)

声明一个可以为null的数组类型.

因此,宣言

public static String format(final String pattern, final @Nullable Object... arguments)
Run Code Online (Sandbox Code Playgroud)

意味着该元件可以是null,而

public static String format(final String pattern, final Object @Nullable... arguments)
Run Code Online (Sandbox Code Playgroud)

声明数组引用可能是null.当然,你可以结合他们宣布两者的元素或阵列本身,可以null

public static String format(String pattern, @Nullable Object @Nullable ... arguments)
Run Code Online (Sandbox Code Playgroud)

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

  • 此处也记录了差异(通过数组语法):http://help.eclipse.org/mars/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftask-using_null_type_annotations。 htm&cp=1_3_9_1_3&anchor=兼容性 (2认同)