Почему экземпляры `Class` и` Class <?> `Ведут себя иначе, чем это должно быть? - PullRequest
0 голосов
/ 01 ноября 2011

Я обнаружил, что:

Когда я использую Class<?> для объявления переменной, getAnnotation действует как:

public <A extends Annotation> A getAnnotation(Class<A> annotationClass)

, но когда я использую Class для объявления переменной, getAnnotation действует как:

public Annotation getAnnotation(Annotation annotationClass)

, поэтому я не смог скомпилировать код, который использует переданные методы, специфичные для класса аннотаций.


например: я мог бы скомпилировать ((Class<?>)clazz).getAnnotation(Human.class).age(), но не смог скомпилировать ((Class)clazz).getAnnotation(Human.class).age(), где clazz - это некоторый экземпляр Class, а Human - интерфейс аннотации, который имеет метод age.

1 Ответ

2 голосов
/ 01 ноября 2011

Ваш вопрос очень неясен, но я подозреваю вы используете необработанный тип.


JLS - 4,8 необработанных типов :

Необработанный тип определяется как:

  • Имя объявления универсального типа, используемого без каких-либо сопутствующих фактических параметров типа.
  • Любой нестатическийчлен типа необработанного типа R, который не унаследован от суперкласса или суперинтерфейса R.

JLS - 4.6 Стирание типа :

Стирание типа - это отображение типов (возможно, включая параметризованные типы и переменные типов) на типы (которые никогда не являются параметризованными типами или переменными типов).


Так что на самом деле этот метод:

public <A extends Annotation> A getAnnotation(Class<A> annotationClass)

стирается до этого:

public Annotation getAnnotation(Class annotationClass)

Вот почему вы можете позвонить getAnnotation, но тип возврата не будет Human, это будет просто Annotation.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...