Що означає клас <?> На Java?


Відповіді:


109

Classє класом, який можна параметризувати, отже, ви можете використовувати синтаксис, Class<T>де Tце тип. Написавши Class<?>, ви декларуєте Classоб'єкт, який може бути будь-якого типу ( ?являє собою підстановку). ClassЄ тип , який містить мета-інформацію про клас.

Завжди корисним є посилання на загальний тип, вказавши його конкретний тип, використовуючи, Class<?>що ви поважаєте цю практику (вам відомо, що її Classможна параметризувати), але ви не обмежуєте свій параметр певним типом.

Довідка про Generics та Wildcards: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html

Довідка про Classоб’єкт та відображення (особливість мови Java, що використовується для самоаналізу): https://www.oracle.com/technetwork/articles/java/javareflection-1536171.html


7
Яка вигода робити це над просто використанням Classбез типу? Вони, здається, представляють те саме.
ashes999

1
Я подумав, що загальним є те, що ти не знаєш типу класу наперед. В іншому випадку ви просто визначите функцію для використання певного типу класу для параметра. Цей знак питання все ще не має сенсу.
Brain2000

5
Немає жодної іншої вигоди, окрім того, що ви говорите компілятору, що "я знаю, що це загальний клас, але я не знаю і не переймаюся фактичним типом, тому замість конкретного типу я надаю ?підстановку". . Якщо ви не надаєте підстановку, компілятор припускає, що ви або забули тип, або не знали, що клас був загальним, і попередить вас про це.
Каяман

1
Що таке еквівалент Class<?>
Котліна

просто Classне можна передати аргумент, який тип є Class<?>, тому Class<?>зручніше для будь-якої ситуації.
petertc

72

Це <?>звір. Це часто призводить до плутанини та помилок, тому що, коли ви бачите це спочатку, то ви починаєте вірити, <?>це підстановка для будь-якого типу 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<?>- це не колекція, яка підходить для будь-якого типу об’єктів. Він може зберігати лише один тип: містичний «непознаний тип». Що не є реальним типом, точно.


8

Це означає, що ваш довідник про клас може містити посилання на будь-який об’єкт класу.

Це в основному те саме, що "Клас", але ви показуєте іншим, хто читає ваш код, що ви не забули про дженерики, ви просто хочете посилання, яке може містити будь-який об'єкт класу.

Брюс Еккель, думаючи на Java:

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


1
У цитаті сказано, що "Клас <?> Віддається перевазі перед звичайним класом" та "Перевага класу <?>". Здається, блок-котирування не узгоджується з кутовими дужками.
Філіп

1
Її потрібно уникати. Виправлено це зараз: P
Самі Кухмонен,

5

Це генеричний літерал. Це означає, що ви не знаєте тип класу, Classякий представляє цей екземпляр, але ви все ще використовуєте загальну версію.

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

5

У дженериках невідомий тип представлений символом підстановки "?". Прочитайте тут для офіційного прикладу.


3

Це означає Клас з типом нічого (невідомо).

Ви повинні прочитати підручник з дженерики Java, щоб краще зрозуміти це

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.