2012-03-29 3 views
83

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

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

+0

http://en.wikipedia.org/wiki/Wildcard_%28Java%29 – Anycorn

+0

http://stackoverflow.com/q/2024513/1140748 –

ответ

67

Class является параметризуемым класс, следовательно, вы можете использовать синтаксис Class<T> где T является типом. Написав Class<?>, вы объявляете объект Class, который может быть любого типа (? является подстановочным знаком). Тип Class - это тип, содержащий метаинформацию о классе.

Это всегда хорошая практика, чтобы обратиться к универсальному типу, указав его конкретного типа, с помощью Class<?> вы уважая эту практику (вы знаете о Class быть параметризуемым), но вы не ограничивая свой параметр, чтобы определенного типа.

Справка о Generics и Wildcards: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html

ссылочного об объекте Class и отражении (в особенности Java языка, используемой для интроспектировать себя): http://java.sun.com/developer/technicalArticles/ALT/Reflection/

+3

В чем преимущество этого, просто используя 'Class' без типа? Кажется, они представляют одно и то же. – ashes999

+0

Я думал, что весь смысл родового, вы не знаете тип класса авансом. В противном случае вы просто определите функцию для использования определенного типа класса для параметра. Этот вопросительный знак все еще не имеет смысла. – Brain2000

+2

Нет другого преимущества, кроме того, что вы говорите компилятору, что «я знаю, что это общий класс, но я не знаю или не забочусь о фактическом типе, поэтому вместо того, чтобы давать конкретный тип, я даю'? 'подстановочный знак.". Если вы не дадите подстановочный знак, компилятор предполагает, что вы либо забыли тип, либо не знали, что класс является общим, и предупредит вас об этом. – Kayaman

5

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

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

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

Вы должны прочитать Java дженериков учебник, чтобы понять это лучше

5

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

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

Брюс Eckel, мышление в Java:

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

+1

цитата говорит «Класс предпочтительнее обычного класса» и « преимущество класса ". Кажется, blockquote не согласуется с угловыми скобками. – MasterF

+0

Необходимо сбежать. Исправлено: P –

3

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

42

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

Это не проблема, если вы используете его с Class. Обе линии работают и компилировать:

Class anyType = String.class; 
Class <?> theUnknownType = String.class; 

Но - если мы начнем использовать его с коллекциями, то мы видим странные ошибки compiletime:

List<?> list = new ArrayList<Object>(); // ArrayList<?> is not allowed 
list.add("a String");     // doesn't compile ... 

Наш List<?> не коллекция, которая подходит для просто любой тип объекта. Он может хранить только один тип: мистический «unkown type». Конечно, это не настоящий тип.

Смежные вопросы