Получение java.lang.Class с генериками - PullRequest
4 голосов
/ 19 октября 2011

Я парень C #, изучающий Java, и я пытаюсь понять, как работают дженерики в Java.

Учитывая класс или интерфейс "SomeThing", я знаю, что могу сделать это, чтобы получить Классэтот тип:

Something.class

Теперь, учитывая универсальный интерфейс

Я бы хотел написать

(GenericInterface<SomeClass>).class 

, но компилятору это не очень нравится.

Спасибо за любую помощь.

Ответы [ 3 ]

9 голосов
/ 19 октября 2011

Это потому, что благодаря стиранию, не класс GenericInterface<SomeClass>. Есть просто класс GenericInterface, который имеет универсальный параметр.

Если вы хотите, чтобы вы могли вызывать обобщенно безопасные методы, такие как Class.cast() или Class.newInstance(), то вам не повезло. Дженерики по сути являются концепцией времени компиляции; во время выполнения недостаточно информации для выполнения общих проверок, и поэтому эти методы не могут быть безопасными для произвольного экземпляра Class.

Лучшее, что вы можете сделать в этом случае, это использовать "raw" GenericInterface.class, а затем сразу же явным образом преобразовать результаты в GenericInterface<SomeClass>. Это правильно выдаст «непроверенное» предупреждение, так как, как упоминалось выше, во время выполнения не проверяется, что объект действительно имеет правильный универсальный параметр, и JVM просто должна принять ваше слово.

(В том же духе, если вы пытаетесь выполнить какую-то проверку instanceof, то это просто невозможно). У объекта нет общего параметра для своего класса; только переменные, которым вы его назначаете. Итак, опять же, эти проверки во время выполнения просто невозможны из-за конструктивных ограничений языка.)

2 голосов
/ 19 октября 2011

Обобщения в корне различаются в Java и C #, поскольку в Java обобщения проверяются во время компиляции, но затем изменяются на конкретный класс в процессе, известном как стирание типа .Используя ваш пример, GenericInterface<SomeClass> становится GenericInterface во время выполнения.

Это немного недооцененная реализация обобщений, и, как вы видите, она представляет некоторые проблемы (которые вы обычно можете обойти).Это было сделано для обеспечения обратной совместимости со старыми версиями Java.

0 голосов
/ 19 октября 2011

Нет, Java Generics не работает таким образом.

Вы можете сделать GenericInterface.class, чтобы попасть в неуниверсальный корневой класс, но для универсальной версии нет отдельного класса.

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