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