вопрос, как указано выше, извините, вероятно, это дубликат, но я не смог найти пример с <?>
в конце.
Почему вы не просто используете 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, чтобы лучше понять его