它是Eclipse中的错误还是为什么我无法使用@NonNull
的完全限定类型名称(FQN)注释参数?
import org.eclipse.jdt.annotation.NonNull;
public class Foo {
// No problem
public void bar(@NonNull String x) {
}
// Error: Type annotations are not allowed on type names used to access
// static members
public void baz(@NonNull java.lang.String x) {
}
}
答案 0 :(得分:6)
这不是Eclipse中的错误。相反,它与Java编译器处理注释类型的方式有关。下面给出的解释说明了这个问题。
首先,@NonNull
注释可以应用于任何类型的使用(它使用@Target(ElementType.TYPE_USE)
注释)。但是,根据Java语言规范应用的类型是注释最接近的类型。这并不总是预期的结果:
在第一种情况下,@NonNull
注释适用于类型String
的使用,这是一种有效类型。因此,注释有效。
然而,在第二种情况下,注释适用于java
,它是包名。因此,它不是有效类型,因此注释不适用于此处。这将导致编译时错误。
Java语言规范(第9.7.4段)规定:
例如,假设注释类型TA仅使用
@Target(ElementType.TYPE_USE)
进行元注释。术语@TA java.lang.Object
和java.@TA lang.Object
是非法的,因为@TA
最接近的简单名称被归类为包名称。另一方面,java.lang.@TA
对象是合法的。
由此我们可以得出结论@NonNull java.lang.String x
不起作用,但是
java.lang.@NonNull String x
会。