Почему Java Class<T>
generic?
Почему Java Class <T> общий?
Ответ 1
Таким образом, можно использовать типичные типизированные методы -
Class<Foo> klass = Foo.class;
Foo f = klass.newInstance();
Foo f = klass.cast(Object);
Ответ 2
Вот достаточно хорошее резюме преимуществ: http://download.oracle.com/javase/tutorial/extra/generics/literals.html
Ответ 3
Вкратце об этом упоминается в разделе Generics версии 1.5 руководства по языку:
Более удивительно, класс Class был расширен. Литералы классов теперь функционируют как токены типа, предоставляя информацию о времени выполнения и времени компиляции. Это позволяет использовать стиль статических фабрик, например, методом getAnnotation в новом интерфейсе AnnotatedElement:
<T extends Annotation> T getAnnotation(Class<T> annotationType);
Это общий метод. Он выводит значение своего параметра T параметра из его аргумента и возвращает соответствующий экземпляр T, как показано следующим фрагментом:
Author a = Othello.class.getAnnotation(Author.class);
До родословных вам пришлось бы придать результат Автору. Также у вас не было бы способа заставить компилятор проверить, что фактический параметр представляет собой подкласс Annotation
Ответ 4
Настоящая причина дается Neil Gafter:
Когда мы добавили generics в Java в JDK5, я изменил класс java.lang.Class, чтобы стать универсальным типом. Например, тип Теперь String.class является классом < Строкa > . Гилад Брача придумал термин типа токены для этого. Мое намерение состояло в том, чтобы включить определенный стиль API, которые Джошуа Блох называет ТГК, или Типы гетерогенных контейнеров шаблон.