Это потому, что благодаря стиранию, не класс GenericInterface<SomeClass>
. Есть просто класс GenericInterface
, который имеет универсальный параметр.
Если вы хотите, чтобы вы могли вызывать обобщенно безопасные методы, такие как Class.cast()
или Class.newInstance()
, то вам не повезло. Дженерики по сути являются концепцией времени компиляции; во время выполнения недостаточно информации для выполнения общих проверок, и поэтому эти методы не могут быть безопасными для произвольного экземпляра Class
.
Лучшее, что вы можете сделать в этом случае, это использовать "raw" GenericInterface.class
, а затем сразу же явным образом преобразовать результаты в GenericInterface<SomeClass>
. Это правильно выдаст «непроверенное» предупреждение, так как, как упоминалось выше, во время выполнения не проверяется, что объект действительно имеет правильный универсальный параметр, и JVM просто должна принять ваше слово.
(В том же духе, если вы пытаетесь выполнить какую-то проверку instanceof
, то это просто невозможно). У объекта нет общего параметра для своего класса; только переменные, которым вы его назначаете. Итак, опять же, эти проверки во время выполнения просто невозможны из-за конструктивных ограничений языка.)