2

如果有一个node<E>具有两个操作的泛型类型,比如setData(E Type)andE getData()并且 lets0是的一个实例,node那么node<? extends Number>为什么编译器s0.setData(Number Type)至少不允许我使用呢?我可以理解为什么不允许使用其他类型,但为什么不允许setData放入 Number 类型,因为我们确定节点的类型至少是 number?

我的代码如下所示:

class Node<E> {
private E data;
// ...
public void setData(E obj) { data = obj; } // (1)
public E getData() { return data; } // (2)
// ...
}
Node<? extends Number> s0 = new Node<Number>();
s0.setData(200); //this is not allowed why?
Node<Number> s0 = new Node<Number>();
s0.setData(100); //But this is allowed!
4

3 回答 3

1

您已声明类型 a Node<? extends Number>。您分配给它的内容无关紧要。

就编译器而言,它可以是以下任何一种:

  • Node<Integer>
  • Node<Float>
  • Node<Double>
  • ETC

而且它无法知道哪种类型是实际类型。

您正在尝试传递 (auto-boxed) Integer,但编译器无法知道实际类型可以接受Integer.

于 2013-03-13T03:58:59.607 回答
0

实质上:因为 aNode<Integer>例如,不是 a Node<Double>它甚至不是一个Node<Number>.

例子:

Node<? extends Number> s0 = new Node<Integer> ();
s0.setData(Double.valueOf(2.0d)); //that's not possible...

实际上,因为我们不知道泛型类型s0setData什么,所以除了null......

于 2013-03-13T03:32:05.690 回答
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 没有的方法怎么办。

于 2013-03-13T03:31:17.800 回答