2015-03-17 2 views
3

Является ли это ошибкой в ​​Eclipse или почему я не могу аннотировать параметры с полными именами типов (FQN) с @NonNull?Почему @NonNull Annotation on 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) { 
     } 
    } 

ответ

5

Это не ошибка в Eclipse. Вместо этого он связан с тем, как типы аннотаций обрабатываются компилятором Java. Объяснение, приведенное ниже, иллюстрирует проблему.

Прежде всего, аннотация @NonNull может применяться к любому типу использования (аннотируется @Target(ElementType.TYPE_USE)). Однако тип, к которому он относится в соответствии с Спецификацией языка Java, является типом аннотации ближайшим. Это не всегда то, что можно было бы ожидать:

В первом случае аннотация @NonNull применяется к типу String, который является допустимым типом. Таким образом, аннотация действительна.

Во втором случае, однако, аннотация относится к java, который является именем пакета. Таким образом, он не является допустимым типом, поэтому аннотация не может применяться здесь. Это приведет к ошибке времени компиляции.

Спецификация языка Java (пункт 9.7.4) гласит:

Например, предположим, что тип аннотаций ТА, которая является мета-аннотированный только с @Target(ElementType.TYPE_USE). Термины @TA java.lang.Object и [email protected] lang.Object являются незаконными, так как простое имя, к которому ближе всего находится @TA, классифицируется как имя пакета. С другой стороны, [email protected] Объект является законным.

Из этого можно сделать вывод, что @NonNull java.lang.String x не будет работать, но [email protected] String x будет.

Также см. The Java Language Specification, Chapter 9.7.4.

+1

Спасибо за это очень хорошее объяснение! Я думаю, что это плохо спроектировано. 'java.lang. @ NonNull String' выглядит очень уродливо, но нормально, это работает :) – Vertex

Смежные вопросы