This question already has answers here:
What is PECS (Producer Extends Consumer Super)?
(14个回答)
去年关闭。
我有一个问题,例如:
水果类
食品分类
盘子类'
我不明白为什么
没有错误
但
是错误的
这两种方法有什么区别?
-全部,谢谢!
第二件事是将此对象分配给
在这一行上:
您正在设置盘子的项目。该
因此,您唯一可以传递给
(14个回答)
去年关闭。
我有一个问题,例如:
水果类
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
的新实例。此处的通用参数推断为Food
,因此右侧创建了一个Plate<Food>
对象。第二件事是将此对象分配给
plate
。 plate
可以是Plate<T>
,只要T
是Fruit
或Fruit
的超类即可。 Food
是Fruit
的超类吗?是的,因此可以将右侧分配给plate
。在这一行上:
plate.setItem(new Food())
您正在设置盘子的项目。该
plate
可以是任何东西的盘子,只要它是Fruit
或Fruit
的超类即可。这意味着传递Food
对象将不起作用。为什么?好吧,如果plate
实际上是Plate<Fruit>
怎么办?可能是,不是吗?编译器不知道。因此,您唯一可以传递给
plate.setItem
的东西是Fruit
和Fruit
的子类。09-12 16:27