2012-05-13 5 views
0

Я хочу знать, что такое использование такого синтаксиса. Я написал простую программу, как показано ниже,Класс <? extends T>

public class Sample{ 

    public static void main(String[] args) { 
     Class<? extends Collection> someCollectionClass = someMethod(); 
    } 

    public static ArrayList someMethod() { 
     return new ArrayList(); 
    } 
} 

Почему он показывает ошибку компиляции, как,

- Collection is a raw type. References to generic type Collection<E> should be 
parameterized 
- Type mismatch: cannot convert from ArrayList to Class<? extends Collection> 

В здесь же, что класс ожидать класс (его на самом деле объект, который он принять знаете, это ?), который расширяет коллекцию. Итак, что случилось с ArrayList?

является Также допустимым, если синтаксис, если я объявить что-то как Class<? extends T>

+0

Вы можете объявить что-то как '' класса , но это не относится к какому-либо объекту в Java, это то, что класс 'Object' для Посмотрите здесь для получения дополнительной информации:. Http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html, но 'Class' относится к фактической реализации и деталям. – dcpomero

ответ

1

Сообщение первая ошибка связана с параметром типа в вашем объявлении:

Class<? extends Collection> someCollectionClass = someMethod(); 

Тип Collection является то, что называется «сырыми типа» в Java, так как интерфейс Collection принимает параметр типа , но ни одна из них не указана в декларации. То же самое относится к неприкрашенному использованию ArrayList.

Однако декларация фактически не делает то, что я думаю, вы думаете, что она делает ... Вы фактически объявляете переменную с именем someCollectionClass, к которой вы можете назначать экземпляры типа Class<? extends Collection>, то есть дескрипторы класса (отражение) конкретный тип). Второе сообщение об ошибке - это компилятор, жалующийся на это: экземпляр типа ArrayList (возвращаемый someMethod) не может быть назначен переменной, тип которой объявляется как «разрешать только экземпляры Class<...> (который является специальным типом времени выполнения Java, описывающим . классы)

Collection someCollection = someMethod(); 
+0

Каково практическое использование такого синтаксиса, пожалуйста? Класс ? – Harshana

5

Поскольку ArrayList не Class. Возможно, вы имеете в виду someMethod().getClass()?

0

someMethod возвращает экземпляр типа List, вы пытаетесь назначить его переменной, ожидающей, что класс Collection не является экземпляром. Следующий код должен работать.

Collection someCollectionClass = someMethod(); 
Смежные вопросы