У меня есть следующие классы.Java Generics Ограничение подстановки не может установить
public class Basket<E> {
private E element;
public void setElement(E x) {
element = x;
}
public E getElement() {
return element;
}
}
class Fruit {}
class Apple extends Fruit {}
class Orange extends Fruit {}
Мое замешательство возникает, когда я рассматриваю следующие случаи.
Basket<? extends Fruit> basket = new Basket<>();
basket.setElement(new Apple()); // cannot set
и
Basket<Fruit> basket = new Basket<>();
basket.setElement(new Apple()); // okay!
Если ? extends Fruit
означает, что я могу передать то, что есть по крайней мере Fruit
(или что-нибудь, который реализует или расширяет), почему это, что я не могу пройти в Apple
типа? Я не вижу никакой разницы между этими двумя случаями, если пропускание Apple
типа во втором случае работает, потому что Apple
является потомком Fruit
...
Так как у нас есть возможность передавать более одного типа фруктов, Java запрещает методы, содержащие '' в качестве параметра? –
Dimitri
Да. E неизвестно, потому что вы использовали подстановочный знак. Поэтому компилятор запрещает вам передавать Apple, потому что E может быть оранжевым. –
Gotcha! Спасибо! – Dimitri