Используя generified версию класса Класс позволяет Вам, среди прочего, писать вещи как
Class<? extends Collection> someCollectionClass = someMethod();
, и затем можно быть уверены, что Объект класса, который Вы получаете, расширяется Collection
, и экземпляром этого класса будет (по крайней мере), Набор.
Из Документации Java:
[...] более удивительно, класс Класс был generified. Литералы класса теперь функционируют как маркеры типа, предоставляя и информацию о типе и времени компиляции во время выполнения. Это включает стиль статических фабрик, иллюстрируемых getAnnotation методом новым интерфейсом AnnotatedElement:
<T extends Annotation> T getAnnotation(Class<T> annotationType);
Это - общий метод. Это выводит значение своего параметра типа T от его аргумента и возвращает соответствующий экземпляр T, как проиллюстрировано следующим отрывком:
Author a = Othello.class.getAnnotation(Author.class);
До дженериков, необходимо было бы бросить результат Автору. Также у Вас не было бы способа осуществить проверку компилятора, что фактический параметр представил подкласс Аннотации. [...]
ну, я никогда не должен был использовать этот вид материала. Кто-либо?
Я нашел class<T>
полезный, когда я создаю поиски реестра сервисов. Например,
<T> T getService(Class<T> serviceClass)
{
...
}
Как другие ответы указывают, существуют многие и серьезные основания, почему это class
было сделано универсальным. Однако существует много времен, которые у Вас нет способа знать, что универсальный тип использует с Class<T>
. В этих случаях можно просто проигнорировать желтые предупреждения затмения, или можно использовать Class<?>
... Это - то, как я делаю это;)
Вы часто хотите использовать подстановочные знаки с Class
. Например, Class<? extends JComponent>
, позволил бы Вам определять, что класс является некоторым подклассом JComponent
. Если Вы получили Class
экземпляр от Class.forName
, то можно использовать Class.asSubclass
, чтобы сделать бросок прежде, чем попытаться, скажем, создать экземпляр.
В начале все запутано. Но это помогает в следующих ситуациях:
class SomeAction implements Action {
}
// Later in the code.
Class<Action> actionClass = Class.forName("SomeAction");
Action action = actionClass.newInstance();
// Notice you get an Action instance, there was no need to cast.