java泛型歧义

时间:2013-03-13 03:24:57

标签: java wildcard bounded-wildcard

如果通用类型node<E>包含setData(E Type)E getData()等两项操作,则s0node的{​​{1}}实例那么为什么编译器不允许我至少使用node<? extends Number>?我可以理解为什么不允许其他类型,但为什么不允许s0.setData(Number Type)放入数字类型,因为我们确定节点的类型至少是数字?

我的代码如下所示:

setData

3 个答案:

答案 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>