2017-01-22 82 views
0

ArrayList<Class<?>>ArrayList<Object>相同但不能轉換的情況怎麼可能?相同的擦除,但不是相同的類型。

我的代碼當前在兩個eclipse錯誤之間切換。

GenericExclusiveSelectionPanel transport = 
       new GenericExclusiveSelectionPanel(StringConstants.TRANSPORT, 
        (ArrayList<Object>)TransportManager.getInstance().getTransportTypes()); 

表示:

Cannot cast from ArrayList<Class<Transportable>> to ArrayList<Object> 

如果我然而除去演員和創建一個構造函數:
GenericExclusiveSelectionPanel(String, ArrayList<Class<Transportable>>)

我得到的日食錯誤:

Erasure of method GenericExclusiveSelectionPanel(String, 
    ArrayList<Class<Transportable>>) is the same as another method in type 
    GenericExclusiveSelectionPanel 

它然後突出構造函數(下)作爲衝突的構造函數。

GenericExclusiveSelectionPanel(String title, ArrayList<Object> arrayList) 
+2

爲什麼你會期望一種類型可以被轉換爲另一種類型,只是因爲它們具有相同的擦除? – user2357112

+0

@LawrenceColes請閱讀[我應該怎麼做當有人回答我的問題](http://stackoverflow.com/help/someone-answers)。是的,很好的問題。從我+1。請看看我的答案,並讓我知道你是否需要任何澄清 – CKing

回答

0

它會更容易理解爲什麼會這樣,如果我們先了解一下類型擦除相對於泛型在Java中表示。繼續操作之前,請從Oracle文檔中查看type erasure

現在您知道什麼類型的擦除意味着,讓我們看看Oracle文檔有關generics的說明。

從文檔中應該清楚,泛型的主要目標是提供更嚴格的編譯時檢查。如果編譯器沒有強制執行鑄造與泛型的檢查將是相當矛盾的。爲了便於討論,考慮假設下列語句被允許:

List<String> strings = new ArrayList<String>();//1 
strings.add("123");//2 
List<Object> objects = strings;//3 
objects.add(1);//4 

如果編譯器不限制在步驟3的分配,你就可以到Integer添加到String對象的列表。 如果編譯器沒有在步驟3中抱怨分配,而又允許我們繼續執行步驟4,則首先使用泛型有什麼好處?

類似地,雖然ArrayList<Class<Transportable>>ArrayList<Object>具有相同的擦除,編譯器就在抱怨他們的任務,如上所述。總之,用泛型限制這些類型與使用相同擦除限制構造函數/方法同樣重要。

相關問題