Java 无法设置泛型通配符边界
Java Generics Wildcard bounding cannot set
我有以下 类.
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
...
的后代
Basket<? extends Fruit>
并不是说只要是Fruit
的子类就可以装任何东西的篮子。它表示某种未知类型的篮子 T
延伸 Fruit
。例如,它可以是 Basket<Apple>
、Basket<Orange>
或 Basket<Fruit>
。因为它可能是 Basket<Orange>
,所以您不能将项目设置为 Apple
。
Basket<Fruit>
是一筐Fruit
。什么水果都行。
我有以下 类.
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
...
Basket<? extends Fruit>
并不是说只要是Fruit
的子类就可以装任何东西的篮子。它表示某种未知类型的篮子 T
延伸 Fruit
。例如,它可以是 Basket<Apple>
、Basket<Orange>
或 Basket<Fruit>
。因为它可能是 Basket<Orange>
,所以您不能将项目设置为 Apple
。
Basket<Fruit>
是一筐Fruit
。什么水果都行。