2017-10-11 33 views
0

首先,爲什麼第一行編譯,而第二行沒有?其次,在第二行的情況下,兩種類型總是需要相同,即左側是整數,右側是整數。或者是否有可能在左側和右側有不同的類型?用不同的數據類型初始化ArrayList

List<? super Integer> nums1 = new ArrayList<Number>(); //COMPILES 
    List<Integer> nums2 = new ArrayList<Number>();   //DOES NOT COMPILE 
+0

你需要什麼? –

+0

只是我的理解。代碼可能不會看到白天的光芒。 – JonJavaK

+1

我猜是因爲'Number'是'Integer'的超類,但不是'Integer'。 – Blorgbeard

回答

2

你的問題是esentially的this SO-article重複,但在短:

? super T的意思是 「什麼是T的父」。 NumberInteger的超類,所以這被接受。第二行不起作用,因爲Number不是Integer。否則反之亦然,

ArrayList<Number> nums2 = new ArrayList<Integer>(); 

也會導致編譯錯誤。爲此,您可以使用

ArrayList<? extends Number> nums2 = new ArrayList<Integer>(); 
+0

然後關閉重複。 –

+0

@ThorbjørnRavnAndersen原因有二:1.我不認爲我可以單獨回答一個問題,我發現這樣做有點粗魯。 2.即使鏈接的SO文章在這裏涵蓋了這個問題,我認爲它更有助於回答這個問題,因爲它更容易理解您的代碼是否用於答案,而不是指向一般答案(這仍然值得閱讀以獲得全部細節) – Lothar