Что означает ‹?› В Java?

Возможный дубликат:
Java Generics

В Eclipse я получаю предупреждения об использовании rawtypes, и одно из исправлений - добавление <?>. Например:

    Class parameter = String.class;
    //Eclipse would suggest a fix by converting to the following:
    Class<?> parameter = String.class;

Что это <?> на самом деле означает?


person trigoman    schedule 27.06.2011    source источник
comment
Если вы хотите углубиться в обобщения, см. эффективную главу 5.   -  person oliholz    schedule 27.06.2011
comment
ИМХО, это означает неразбериху. ;)   -  person Peter Lawrey    schedule 27.06.2011


Ответы (6)


Необработанные типы относятся к использованию универсального типа без указания параметра типа. Например, List - это необработанный тип, а List ‹String› - параметризованный тип.

См. Этот документ для получения дополнительной информации: http://www.javapractices.com/topic/TopicAction.do?Id=224

person Naftali aka Neal    schedule 27.06.2011
comment
@ Джейсон, какую версию ответа вы смотрите? - person Naftali aka Neal; 27.06.2011

Class<?> следует интерпретировать как Class чего-то, но это что-то не известно или о чем не заботятся.

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

person Jason S    schedule 27.06.2011

Это выходит за рамки этого сайта, но вот несколько ссылок:

person Sean Patrick Floyd    schedule 27.06.2011

Предупреждение означает, что List ожидает тип элементов, но вы его не указали. Поскольку компилятор не может определить, допустили ли вы ошибку или что-то забыли, он выдает предупреждение.

Есть несколько решений: Если вам действительно все равно, что находится в списке, используйте <?>. Это означает «может быть что угодно, мне все равно».

Если вам, вероятно, не все равно, но это старый устаревший код, и вы не хотите его исправлять, сообщите Eclipse, чтобы он игнорировал его с помощью @SuppressWarnings("rawtypes") и / или @SuppressWarnings("unchecked"), если вы выполняете приведение.

Лучшее решение - определить правильный тип и использовать его. Таким образом, компилятор может помочь вам отловить больше опечаток во время компиляции.

person Aaron Digulla    schedule 27.06.2011

Класс является универсальным типом, начиная с Java 5 (лет назад).

Прочтите руководство по универсальным шаблонам Java.

person JB Nizet    schedule 27.06.2011

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

Например:

Class<String> parameter = String.class;
person Chris Hutchinson    schedule 27.06.2011