Моє запитання, як вище. Вибачте, це, мабуть, дублікат, але я не міг знайти приклад із <?>
кінцем.
Чому б ви не просто використовували Class
як параметр?
Моє запитання, як вище. Вибачте, це, мабуть, дублікат, але я не міг знайти приклад із <?>
кінцем.
Чому б ви не просто використовували Class
як параметр?
Відповіді:
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
Class
без типу? Вони, здається, представляють те саме.
?
підстановку". . Якщо ви не надаєте підстановку, компілятор припускає, що ви або забули тип, або не знали, що клас був загальним, і попередить вас про це.
Class<?>
Class
не можна передати аргумент, який тип є Class<?>
, тому Class<?>
зручніше для будь-якої ситуації.
Це <?>
звір. Це часто призводить до плутанини та помилок, тому що, коли ви бачите це спочатку, то ви починаєте вірити, <?>
це підстановка для будь-якого типу 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<?>
- це не колекція, яка підходить для будь-якого типу об’єктів. Він може зберігати лише один тип: містичний «непознаний тип». Що не є реальним типом, точно.
Це означає, що ваш довідник про клас може містити посилання на будь-який об’єкт класу.
Це в основному те саме, що "Клас", але ви показуєте іншим, хто читає ваш код, що ви не забули про дженерики, ви просто хочете посилання, яке може містити будь-який об'єкт класу.
Брюс Еккель, думаючи на Java:
У Java SE5 перевага віддається класу <?> Перед звичайним класом, навіть якщо вони еквівалентні, і звичайний клас, як ви бачили, не створює попередження компілятора. Перевага класу <?> Полягає в тому, що він вказує на те, що ви не просто використовуєте неспецифічну довідку про клас випадково або з незнання. Ви вибрали неспецифічну версію.
Це генеричний літерал. Це означає, що ви не знаєте тип класу, Class
який представляє цей екземпляр, але ви все ще використовуєте загальну версію.
Class<Foo>
. Таким чином ви можете створити новий екземпляр, наприклад, без кастингу:Foo foo = clazz.newInstance();