2013-03-13 39 views
1

如果有一个泛型类型node<E>与像setData(E Type)两个操作和E getData(),让s0node一个实例由node<? extends Number>那么我们为什么不编译器允许我至少使用s0.setData(Number Type)?我可以理解为什么不允许其他类型,但为什么不允许setData输入一个数字类型,因为我们确信节点的类型至少是数字?的java通用歧义

我的代码如下所示:

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! 
+0

你如何测试代码? – 2013-03-13 03:28:11

+0

显示一些代码,很难理解你的意思。 – Mordechai 2013-03-13 03:30:48

回答

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香蕉或苹果?或香蕉苹果?如果苹果和香蕉含有水果没有的方法会怎么样?

+0

我们知道节点至少可以成为水果,为什么不允许添加水果的子类型。为什么添加操作不允许扩展,只有超级? 我总是可以做s0.setFruit(苹果),并使用getFruit()返回,我在哪里违反类型安全? – 2013-03-13 03:50:37

+0

如果Java允许通过'Node <?添加任何水果?延伸水果> s0',那么这意味着它也可能增加香蕉到苹果。看看Node <?延伸Fruit> s1 =新节点; s1.add(new Banana());'是正确的,因为'Banana extends Fruit'。 – Pshemo 2013-03-13 04:00:16

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 ...

+0

但是我们不确定它至少可以是一个数字,那么为什么不允许输入数字呢? – 2013-03-13 03:45:35

+0

@VishakhPC在我的例子中,s0实际上是关于Integer的,所以没有理由让编译器允许你在那里添加Doubles或BigDecimals。 – assylias 2013-03-13 03:46:35

0

您已声明类型为Node<? extends Number>。你什么分配它是无关紧要的。

至于编译器来说它可能是以下任何一种:

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

而且它没有任何的办法知道哪种类型是实际吨YPE。

您正在试图通过一个(自动盒装)Integer,但是编译器无法知道实际类型可以接受Integer

+0

为什么不,我们是不是告诉它它至少可以是一个数字或者它的任何子类型? Number是否扩展并且不是Number的整数子类型? – 2013-03-13 04:06:09

+0

为什么不呢?因为你可以给变量'Node <?>分配一个'Node '。扩展Number> s0'。如果用'Integer'调用'Node '的'setData()'方法,你会怎么想呢? – Bohemian 2013-03-13 04:32:32

+0

参考我发布的代码,为什么我不能添加任何子类型?在类型相同的情况下,只能使用setData(200)节点 2013-03-13 04:37:01