2013-03-13 67 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