6

它是 Eclipse 中的一个错误,还是为什么我不能用完全限定类型名称 (FQN) 注释参数@NonNull

    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) {
        }
    }
4

1 回答 1

8

这不是 Eclipse 中的错误。相反,它与 Java 编译器处理注解类型的方式有关。下面给出的解释说明了这个问题。

首先,@NonNull注解可以适用于任何类型的使用(它用 进行注解@Target(ElementType.TYPE_USE))。但是,根据 Java 语言规范,它适用的类型是注解最接近的类型。这并不总是预期的:

在第一种情况下,@NonNull注释适用于 type 的使用String,这是一个有效的类型。因此,注释是有效的。

然而,在第二种情况下,注释适用于java,这是一个包名。因此,它不是一个有效的类型,所以注释不能在这里应用。这将导致编译时错误。

Java 语言规范(第 9.7.4 段)指出:

例如,假设注释类型 TA 仅使用 进行元注释@Target(ElementType.TYPE_USE)。术语@TA java.lang.Objectjava.@TA lang.Object是非法的,因为@TA最接近的简单名称被归类为包名称。另一方面,java.lang.@TAObject 是合法的。

由此我们可以得出结论,这@NonNull java.lang.String x不会奏效,但 java.lang.@NonNull String x会奏效。

另请参阅Java 语言规范,第 9.7.4 章

于 2015-03-17T11:26:21.170 回答