如果通用类型node<E>
包含setData(E Type)
和E getData()
等两项操作,则s0
是node
的{{1}}实例那么为什么编译器不允许我至少使用node<? extends Number>
?我可以理解为什么不允许其他类型,但为什么不允许s0.setData(Number Type)
放入数字类型,因为我们确定节点的类型至少是数字?
我的代码如下所示:
setData
答案 0 :(得分:0)
假设您有参考Node<? extends Fruits> s0
。这意味着它可以指向
Node<? extends Fruit> s0 = new Node<Fruit>;
但也
Node<? extends Fruit> s0 = new Node<Apple>;
和
Node<? extends Fruit> s0 = new Node<Banana>;
您如何看待,将香蕉或苹果添加Fruit
是否安全?还是香蕉到苹果?如果Apple和Banana包含Fruit没有的方法怎么办。
答案 1 :(得分:0)
小心:因为例如Node<Integer>
不是Node<Double>
。 It is not even a Node<Number>
.
示例:
Node<? extends Number> s0 = new Node<Integer> ();
s0.setData(Double.valueOf(2.0d)); //that's not possible...
实际上,因为我们不知道s0
的泛型类型是什么,所以除setData
之外的任何内容都无法调用null
方法... < / p>
答案 2 :(得分:0)
您已将类型声明为Node<? extends Number>
。您分配的内容无关紧要。
就编译器而言,它可以是以下任何一种:
Node<Integer>
Node<Float>
Node<Double>
并且它无法知道哪种类型是实际类型。
您正在尝试传递(自动装箱)Integer
,但编译器无法知道实际类型可以接受Integer
。< / p>