2010-11-20 247 views
2

我想創建的字符串列表清單,類型不匹配錯誤

List<List<String>> string= new ArrayList<ArrayList<String>>(); 

並獲得類型不匹配錯誤:不能轉換從ArrayList<ArrayList<String>>List<List<String>>

我知道我可以改變

List<List<String>> to ArrayList<ArrayList<String>> 

,它會正常工作。

但我只是想知道爲什麼它不讓它發生?簡單的List<Object>可以參考ArrayList<Object>所以這有什麼不同?

回答

1

因爲List<List<String>>會接受不是數組列表的其他字符串列表,這不是您最初聲明類型的方式。例如,如果您轉換爲List<List<String>>,那麼您在技術上會被允許向其添加LinkedList<String>!這不是一個ArrayList<String>。允許演員陣容將有效地打破泛型類型系統。

換句話說,你可能轉換爲List<ArrayList<String>>。但不是List<List<String>>

+0

謝謝你,很好的解釋。另外,感謝StudiousJoseph。 – 2010-11-20 07:07:34

1
List<List<String>> string = new ArrayList<List<String>>() 

會是正確的做法。

問候,

1

不能分配給ArrayList<ArrayList<String>>List<List<String>>因爲它違反了泛型的編譯時類型安全的承諾。如果這項任務是有效的,那麼我們可以將LinkedList<String>插入ArrayList<ArrayList<String>>並破壞類型安全性。

這是的典型示例是List<Number>不是List<Integer>。它可以通過矛盾容易地表現出來。

List<Integer> ints = new ArrayList<Integer>(); 
ints.add(42); 

//This results in compiler error 
/* List<Number> nums = ints; */ 
//If it were not and an error, then you could 

List<Number> nums = ints; 
//Now you can insert doubles into a list of `Number`s 
nums.add(0.1); 

//This would allow 0.1 to assign to an int 
Integer x=ints.get(1); 
//This will cause ClassCastException and 
//violate type-safety provided by generics. 
0

除了什麼傢伙已經說過,我想發現你寫的定義: 的ArrayList>() 爲你工作,但還不夠好。

你應該說:

名單>名單=新的ArrayList>();

如果存在抽象類或接口,該規則從不將具體類寫入泛型定義,並且在賦值的左側部分不寫入。我的版本允許在將來更改列表實現,而無需更改使用此數據結構的代碼。

此外List是一個集合。如果您使用特定列表的功能無關緊要(例如如果你打算只遍歷這個列表),你可以說:

Collection> list = new ArrayList>();

在這種情況下,在未來,你甚至可以更改列表設置:

集>列表=新LinkedHashSet>();