Мой вопрос такой же, как указано выше. Извините, вероятно, это дубликат, но я не смог найти пример со знаком <?>
на конце.
Почему бы вам просто не использовать Class
в качестве параметра?
Мой вопрос такой же, как указано выше. Извините, вероятно, это дубликат, но я не смог найти пример со знаком <?>
на конце.
Почему бы вам просто не использовать Class
в качестве параметра?
Ответы:
Class
является параметризуемым классом, поэтому вы можете использовать синтаксис, Class<T>
где T
- тип. Написав Class<?>
, вы объявляете Class
объект, который может быть любого типа ( ?
подстановочный знак). Class
Является тип , который содержит мета-информацию о классе.
Всегда полезно ссылаться на общий тип, указав его конкретный тип, используя Class<?>
вы соблюдаете эту практику (вы знаете, Class
что это параметризуемый), но вы не ограничиваете свой параметр определенным типом.
Ссылка на обобщения и подстановочные знаки: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
Справка об Class
объекте и отражении (функция языка Java, используемая для самоанализа): https://www.oracle.com/technetwork/articles/java/javareflection-1536171.html
Class
без типа? Кажется, они представляют одно и то же.
?
подстановочный знак». , Если вы не укажете подстановочный знак, компилятор предполагает, что вы либо забыли тип, либо не знали, что класс является универсальным, и предупредит вас об этом.
Class<?>
Class
нельзя перейти к аргументу, тип которого есть Class<?>
, так Class<?>
что удобнее для всей ситуации.
Это <?>
зверь. Это часто приводит к путанице и ошибкам, потому что, когда вы сначала видите это, то начинаете верить, <?>
что это подстановочный знак для любого типа java . Что .. неправда. <?>
это неизвестный тип , небольшая и неприятная разница.
Это не проблема, когда вы используете его с Class
. Обе строки работают и компилируются:
Class anyType = String.class;
Class <?> theUnknownType = String.class;
Но - если мы начнем использовать его с коллекциями, то увидим странные ошибки времени компиляции:
List<?> list = new ArrayList<Object>(); // ArrayList<?> is not allowed
list.add("a String"); // doesn't compile ...
Наша List<?>
коллекция не подходит для любого типа объекта. Он может хранить только один тип: мистический «неизвестный тип». Который, конечно, не настоящий тип.
Это означает, что ваша ссылка на класс может содержать ссылку на любой объект класса.
Это в основном то же самое, что и «Класс», но вы показываете другим людям, которые читают ваш код, что вы не забыли о дженериках, вам просто нужна ссылка, которая может содержать любой объект класса.
Брюс Экель, мышление на Java:
В Java SE5 класс <?> Предпочтительнее простого класса, даже если они эквивалентны, а простой класс, как вы видели, не выдает предупреждения компилятора. Преимущество Class <?> Состоит в том, что он указывает на то, что вы не случайно или по незнанию используете неспецифическую ссылку на класс. Вы выбрали неконкретную версию.
Это литерал дженериков . Это означает, что вы не знаете тип класса, Class
который представляет этот экземпляр, но вы все еще используете общую версию.
Class<Foo>
. Таким образом вы можете создать новый экземпляр, например, без приведения:Foo foo = clazz.newInstance();