这个问题已经在这里有了答案: > What is PECS (Producer Extends Consumer Super)? 11个
我有一个问题,例如:
水果类
public class Fruit extends Food {
public static void main(String[] args) {
Plate<? super Fruit> plate = new Plate<>(new Food());
plate.setItem(new Apple());
plate.setItem(new Food());
}
static class Apple extends Fruit {
}
}
食品类
public class Food {
}
板类
public class Plate<T> {
private T item;
public Plate(T t) {
item = t;
}
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
}
我不明白为什么
Plate<? super Fruit> plate = new Plate<>(new Food())
没有错误
但
plate.setItem(new Food())
是错误的
这两种方法有什么区别?
-全部,谢谢!
最佳答案
这条线上发生了两件事:
Plate<? super Fruit> plate = new Plate<>(new Food());
new Plate(new Foo())创建Plate的新实例.这里的一般参数被推断为食品,因此右侧创建了一个Plate< Food>.宾语.
第二件事是该对象已分配给板.板可以是板T.只要T是Fruit或Fruit的超类.食物是水果的超类吗?是的,因此可以将右侧分配给印版.
在这一行上:
plate.setItem(new Food())
您正在设置盘子的项目.该盘子可以是任何东西的盘子,只要它是Fruit或Fruit的超类即可.这意味着传递Food对象将无效.为什么?好吧,如果盘子实际上是Plate< Fruit>会怎样?可能是,不是吗?编译器不知道.
因此,您唯一可以传递给plate.setItem的东西是Fruit和Fruit的子类.