Что означает класс <?> В Java?

вопрос, как указано выше, извините, вероятно, это дубликат, но я не смог найти пример с <?> в конце.

Почему вы не просто используете Class в качестве параметра?

Ответ 1

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/

Ответ 2

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

Ответ 3

Это generics литерал. Это означает, что вы не знаете тип класса, который представляет этот экземпляр Class, но вы все еще используете общую версию.

  • Если вы знаете класс, вы должны использовать Class<Foo>. Таким образом, вы можете создать новый экземпляр, например, без каста: Foo foo = clazz.newInstance();
  • если вы вообще не используете дженерики, вы получите предупреждение хотя бы (и не использовать generics, как правило, обескуражены, так как это может привести к жестким обнаруженным побочным эффектам)

Ответ 4

Это означает, что ссылка на класс может содержать ссылку на любой объект класса.

В основном это то же самое, что и "Класс", но вы показываете другим людям, которые читают ваш код, который вы не забыли о дженериках, вам просто нужна ссылка, которая может содержать любой объект класса.

Брюс Эккель, Мышление в Java:

В Java SE5 класс <? > является предпочтительным по сравнению с обычным классом, хотя они эквивалентны, а обычный класс, как вы видели, не создает предупреждение компилятора. Преимущество класса <? > Заключается в том, что он указывает, что вы arent просто используете неспецифическую ссылку класса на несчастного случая или из-за незнания. Вы выбрали неспецифическую версию.

Ответ 5

В дженериках неизвестный тип представлен символом подстановки "?". Прочтите здесь для официального примера.

Ответ 6

Это означает класс с типом чего-либо (неизвестного).

Вы должны прочитать учебник java generics, чтобы лучше понять его