2015-10-30 211 views
0

在Java泛型,如果鍵入Java泛型和鑄造

List<Object> l = new ArrayList<>(); 
List<String> l2 = l; //no casting works here 

它不會編譯,報告不可兌換類型List<Object> to List<String>。但是:

List<? extends Object> l = new ArrayList<>(); 
List<String> l2 = (List<String>) l; 
List<String> l3 = (List<String>) l; 

沒有工作。爲什麼會這樣?

回答

3

這是因爲List<? extends Object>可能實際上指List<String>,因此編譯器信任的開發商。

在第一種情況下,編譯知道,中投會搞亂與假設其他代碼會(即你可以把每樣物品投入ll2將只包含字符串),因此能夠拒絕演員。

相同(或類似的東西)發生用普通的對象:

Integer i = new Integer(1); 
String s = (String)i; 

因爲編譯器知道一個Integer對象不可能被投射到String上面將失敗。

但是,由於編譯器不知道i的實際類型(認爲i來自代碼中的其他地方),因此編譯器必須相信您知道您在做什麼。

Object i = new Integer(1); 
String s = (String)i; 
2
List<Object> l = new ArrayList<>(); 
List<String> l2 = l; //no casting works here 

它不工作,因爲你要分配給List<Object>List<String> 然而這些不兼容的類型;

List<? extends Object> l = new ArrayList<>(); 
List<String> l2 = (List<String>) l; 
List<String> l3 = (List<String>) l; 

這樣做是因爲,在編譯時它會檢查List<? extends Object>可強制轉換爲List<String>

當我們不使用extends關鍵字類型的預計是準確的。