2014-04-17 18 views
1

當我執行下面的代碼時,它沒有任何問題。添加到空列表

List<String> singletonList = Collections.singletonList("Hello"); 
List<String> s = Collections.emptyList(); 
singletonList.addAll(s); 

但是,當我試圖做下面的事情給我編譯錯誤。爲什麼?

List<String> singletonList = Collections.singletonList("Hello"); 
singletonList.addAll(List<String> Collections.emptyList()); 

Collections.emptyList是創建空列表的類型安全方法。但是爲什麼我的程序不能編譯呢?我知道我無法添加到不可變列表(UnsupportedOperationException),但添加空列表是允許的。其實我正在測試這個,我注意到上面的東西。

+0

閱讀答案後,我很想知道你使用的是什麼Java版本。 – maxx777

+0

我正在使用JDK7。 – ParagJ

+0

當你收到一個編譯錯誤並且詢問一個關於它的問題時,總是在你的問題中包含確切的錯誤信息 - 這使得它更容易幫助你。 – Jesper

回答

4

Collections.emptyList()返回List<Object>這是不是(沒有任何類型的關係)List<String>因此鑄造是不允許的。

你需要的是以下幾點:

singletonList.addAll(Collections.<String>emptyList()); 
+0

謝謝。你的代碼有效。但爲什麼不允許鑄造?我可以寫Object o =「abc」; – ParagJ

+1

@ParagJ一個'String'是一個'Object',但是一個'List '不是'List

+1

必須有一個類型關係(父子,父子)才能投入工作。例如'String'是一個'Object'。 –

2

在Java 8中,類型推斷得到改善。你可以做

List<String> singletonList = Collections.singletonList("Hello"); 
singletonList.addAll(Collections.emptyList()); 

emptyList()調用類型參數將被使用的情況下,即推斷。它期望Collection<? extends String>

+0

+1。這是很好的知道,它已被改進8。 –