2013-07-15 280 views
3

這裏的示例代碼:Java泛型類型轉換

public static BaseListAdapter<? extends Item> getListAdapter() { 
    ... 
} 

... 

public class MyClass<T extends Item> { 
    ... 
    BaseListAdapter<T> adapter = (BaseListAdapter<T>) getListAdapter(); 
    ... 
} 

編譯器抱怨有一個未經檢查的演員。

java: unchecked cast 
    need: BaseListAdapter<T> 
    found: BaseListAdapter<capture#1, ? extends Item> 

我想知道爲什麼會產生此警告以及如何解決它。

+2

警告沒有錯誤。你告訴編譯器'BaseListAdapter <?通過明確的轉換擴展Item>'的類型'BaseListAdapter ''。編譯器只是說他無法驗證這一點,所以你是獨立的。 –

+0

請參閱此鏈接, 這可能有幫助 http://stackoverflow.com/questions/262367/type-safety-unchecked-cast –

回答

0

這是因爲,雖然BaseListAdapter接受來自項目延長任何類型的,你明確地鑄造任何醇」類型BaseListAdapter到BaseListAdapter與T類型,這是不一定相同鍵入,因此錯誤。

如果你想修復它,那麼你需要避免完全投射並用Item來管理,或者使BaseListAdapter處理T而不是一些未命名的類型?擴展Item。

+0

謝謝!你的答案既簡單又明確。 – Lion

6

你可能想

public static <T extends Item> BaseListAdapter<T> getListAdapter() { 
+0

這是否真的能解決問題?這裏的「T」保證與課堂上使用的「T」相同嗎?我不這麼認爲,如果該方法與「MyClass」不同的類。 –

+0

仍然警告似乎並沒有消失 – sanbhat

+0

@RohitJain:'T'肯定是不同的。但是它不是仍然有效嗎?這與'Collections#emptyList'中的模式相同,它也返回一個可以適合「任何」T的列表。 – Thilo