Что делает классзначит на яве? - PullRequest
116 голосов
/ 29 марта 2012

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

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

Ответы [ 6 ]

92 голосов
/ 29 марта 2012

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

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

Справочник по шаблонам и шаблонам: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html

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

58 голосов
/ 29 марта 2012

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

6 голосов
/ 29 марта 2012

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

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

Брюс Экель, Thinking in Java:

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

5 голосов
/ 29 марта 2012

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

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

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

3 голосов
/ 29 марта 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...