2012-03-30 60 views
15

我想分解兩個列表: 首先是一個整數列表。我decare它爲:爲什麼泛型列表的聲明有所不同?

List<Integer> ints= Arrays.asList(1,2,3); 

它工作正常。

其次是對象列表。我宣佈它爲:

List<Object> objs= Arrays.asList(1,2.13,"three"); 

但是它會在我寫它時立即給出一個錯誤。錯誤是:

Multiple markers at this line 
- Type mismatch: cannot convert from List<Object&Comparable<?>&Serializable> to 
List<Object> 
- Type safety: A generic array of Object&Comparable<?>&Serializable is created for 
     a varargs parameter 

相反,如果我寫

List<Object> objs = Arrays.<Object>asList(1,2.13,"three"); 

它工作正常。

我無法弄清楚原因。

回答

14

this post on stackoverflow

基於實際參數15.12.2.7推斷類型參數

的超類型約束T:> X意味着該解決方案是 之一X的超類型鑑於幾個這樣的約束對T,我們可以相交 由每個約束隱含的超類型集合,因爲 類型參數必須是它們全部的成員。然後,我們可以選擇最 特定類型是在路口

StringDoubleInteger之間最嚴格的類型路口既是接口ComparableSerializable。所以,當你寫

Arrays.asList(1,2.13,"three"); 

據推斷Timplements Comparable<?>, Serializable。那麼這是因爲如果你正在做

List<Object> objs = new List<T extends Comparable<?>, Serializable> 

顯然,這是不允許的。
在另一方面,當您指定Object明確使用

Arrays.<Object>asList(1,2.13,"three"); 

沒有推理由

+0

明白了。感謝非常好的解釋。如果出現這種混淆,這將是一個適用的金科玉律。 – 2012-03-30 12:29:31

2

使用此作品完美

List<? extends Object> objs = Arrays.asList(10,20.32,"test"); 

System.out.println(objs); 

輸出: [10,20.32,測試]

+3

這沒什麼,但請注意,就編譯器而言,'List '與* List不同*?擴展Object>',而OP可能需要一個'List ' – Bohemian 2012-03-30 12:10:23

+1

-1正如OP所述,'數組。 asList(1,2.13,「three」)'很好。問題是爲什麼編譯器無法推斷Object,而不是如何破解解決方案。 – 2012-03-30 18:18:56

相關問題