为什么不允许在FQN上使用@NonNull注释?

时间:2015-03-17 10:49:30

标签: java eclipse non-nullable

它是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) {
        }
    }

1 个答案:

答案 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.Objectjava.@TA lang.Object是非法的,因为@TA最接近的简单名称被归类为包名称。另一方面,java.lang.@TA对象是合法的。

由此我们可以得出结论@NonNull java.lang.String x不起作用,但是 java.lang.@NonNull String x会。

另见The Java Language Specification, Chapter 9.7.4