Я хотел бы знать, что означает эти две строки в <>.Java generic <Something>
LinkedList<? extends SomeClass> x;
LinkedList<Class<?extends SomeClass>> x;
Я хотел бы знать, что означает эти две строки в <>.Java generic <Something>
LinkedList<? extends SomeClass> x;
LinkedList<Class<?extends SomeClass>> x;
В двух словах он предусматривает дополнительное повторное использование кода и устраняет необходимость в литье типов. См. Java trail для guide.
Самый простой способ подумать об этом - это то, что вы можете использовать в коде как местозаполнитель, где код может быть более общим, чем какой-либо конкретный, и может быть поэтому более пригодным для повторного использования.
something
Между скобками подразумевается параметр типа, который может быть заменен любым типом, для которого он ограничен. В случае только something
это может быть любой тип, но в случае, который вы указываете в своем вопросе ? extends SomeClass
, он ограничен типами SomeClass
или любыми подклассами SomeClass
.
ВАЖНО: информация о типе, предусмотренный между <>
стирается во время выполнения (так называемый type-erasure
), поэтому есть некоторые ограничения, о том, как он используется, например, это не будет работать:
List<Animal> animals = new ArrayList<Dog>();
где Dog
является подклассом Animal
. Нечто подобное можно с регулярными массивами Однако, если информация о типе еще известна во время выполнения, и положить что-то иное, чем Dog
типа приведет к ArrayStoreException
Спасибо за такой приятный ответ! – Jake
List<? extends Object> ls2 = new LinkedList<Number>();
Это означает, что компилятор позволит назначить colletion ко всем возможным неизвестным подтипам Object. Поскольку у вас есть операция add, компилятор отказывается дать вам зеленый свет, потому что он не знает, соответствует ли тип предоставленного объекта ограничению неизвестного подтипа объекта. Это называется ковариацией.
Спасибо за ваш ответ! – Jake
см. Здесь https://docs.oracle.com/javase/tutorial/extra/generics/index.html – ashiquzzaman33