2015-09-21 2 views
-5

Я хотел бы знать, что означает эти две строки в <>.Java generic <Something>

LinkedList<? extends SomeClass> x; 
LinkedList<Class<?extends SomeClass>> x; 
+2

см. Здесь https://docs.oracle.com/javase/tutorial/extra/generics/index.html – ashiquzzaman33

ответ

3

В двух словах он предусматривает дополнительное повторное использование кода и устраняет необходимость в литье типов. См. Java trail для guide.

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

something Между скобками подразумевается параметр типа, который может быть заменен любым типом, для которого он ограничен. В случае только something это может быть любой тип, но в случае, который вы указываете в своем вопросе ? extends SomeClass, он ограничен типами SomeClass или любыми подклассами SomeClass.

ВАЖНО: информация о типе, предусмотренный между <> стирается во время выполнения (так называемый type-erasure), поэтому есть некоторые ограничения, о том, как он используется, например, это не будет работать:

List<Animal> animals = new ArrayList<Dog>(); 

где Dog является подклассом Animal. Нечто подобное можно с регулярными массивами Однако, если информация о типе еще известна во время выполнения, и положить что-то иное, чем Dog типа приведет к ArrayStoreException

+0

Спасибо за такой приятный ответ! – Jake

0
List<? extends Object> ls2 = new LinkedList<Number>(); 

Это означает, что компилятор позволит назначить colletion ко всем возможным неизвестным подтипам Object. Поскольку у вас есть операция add, компилятор отказывается дать вам зеленый свет, потому что он не знает, соответствует ли тип предоставленного объекта ограничению неизвестного подтипа объекта. Это называется ковариацией.

+0

Спасибо за ваш ответ! – Jake