вопрос, как указано выше, извините, вероятно, это дубликат, но я не смог найти пример с <?> в конце.
Почему вы не просто используете Class в качестве параметра?
вопрос, как указано выше, извините, вероятно, это дубликат, но я не смог найти пример с <?> в конце.
Почему вы не просто используете Class в качестве параметра?
Class является параметризуемым классом, поэтому вы можете использовать синтаксис Class<T>, где T - тип. Написав Class<?>, вы объявляете объект Class, который может быть любого типа (? является подстановочным знаком). Тип Class - это тип, содержащий метаинформацию о классе.
Всегда полезно относиться к родовому типу, указывая его конкретный тип, используя Class<?>, вы уважаете эту практику (вы знаете, что Class является параметризуемым), но вы не ограничиваете свой параметр имеет определенный тип.
Справка о дженериках и подстановочных знаках: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
Ссылка на объект класса и отражение (особенность языка Java, используемого для самоанализа): http://java.sun.com/developer/technicalArticles/ALT/Reflection/
Этот <?> - зверь. Это часто приводит к путанице и ошибкам, потому что, когда вы видите это сначала, вы начинаете верить, <?> является подстановочным знаком для любого типа 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<?> не является сборником, который подходит только для любого типа объекта. Он может хранить только один тип: мистический "unkown type". Конечно, это не настоящий тип.
Это generics литерал. Это означает, что вы не знаете тип класса, который представляет этот экземпляр Class, но вы все еще используете общую версию.
Class<Foo>. Таким образом, вы можете создать новый экземпляр, например, без каста: Foo foo = clazz.newInstance();Это означает, что ссылка на класс может содержать ссылку на любой объект класса.
В основном это то же самое, что и "Класс", но вы показываете другим людям, которые читают ваш код, который вы не забыли о дженериках, вам просто нужна ссылка, которая может содержать любой объект класса.
Брюс Эккель, Мышление в Java:
В Java SE5 класс <? > является предпочтительным по сравнению с обычным классом, хотя они эквивалентны, а обычный класс, как вы видели, не создает предупреждение компилятора. Преимущество класса <? > Заключается в том, что он указывает, что вы arent просто используете неспецифическую ссылку класса на несчастного случая или из-за незнания. Вы выбрали неспецифическую версию.
В дженериках неизвестный тип представлен символом подстановки "?". Прочтите здесь для официального примера.
Это означает класс с типом чего-либо (неизвестного).
Вы должны прочитать учебник java generics, чтобы лучше понять его