2010-04-07 60 views
30

投我嘗試對象轉換我的Action類,但它導致了警告:類型安全:未選中的對象

Type safety: Unchecked cast from Object to Action<ClientInterface> 

Action<ClientInterface> action = null; 
try { 
Object o = c.newInstance(); 
if (o instanceof Action<?>) { 
    action = (Action<ClientInterface>) o; 
} else { 
    // TODO 2 Auto-generated catch block 
    throw new InstantiationException(); 
} 
[...] 

感謝您的幫助

+0

'c'的類型是什麼? – meriton 2010-04-07 13:21:10

+0

關於c的類型: 類 c = null; c = Class.forName(className); 無論如何,我有足夠明確的答案!謝謝大家,是否有可能以某種方式關閉問題或將問題標記爲已回答? – Matthew 2010-04-07 14:28:40

+0

是的,使用您偏好答案左邊的綠色複選標記。的 – meriton 2010-04-07 15:44:47

回答

53

是 - 這是一個自然的type erasure的後果。如果o實際上是不會被投被捕獲的Action<String>實例 - 你只看到了問題,當您嘗試使用它,通過在ClientInterface而不是字符串。

可以使用擺脫警告:

@SuppressWarnings("unchecked") 

的功能註釋,但你不能輕易理清潛在的問題:(

1

不要擔心它。因爲Java編譯器沒有辦法知道,什麼是真正的對象的類型。

1

你已經失去了,因爲刪除的信息類型(即,參數化類型已經被刪除),因此警告。你可以除了清理周圍的代碼之外,別無所求泛型更頻繁使用,所以您可以傳遞泛型類型信息並避免投射。

5

警告意味着,編譯器不能保證類型安全,即使鑄造在運行時工作正常。由於擦除,在運行時,該投射只是對Action的投射。根據預期,基礎泛型類可能不是ClientInterface類型。在這種情況下,問題將在稍後出現(可能甚至更晚),作爲ClassCastException。

在我建議抑制由以下編譯器指令這個特定的警告這種特殊情況下:

@SuppressWarnings("unchecked") 
14

像往常一樣,喬恩斯基特是正確的。

爲了詳細說明他的回答的未輕易部分:

鑑於

class ClientAction implements Action<ClientInterface> {} 

你可以寫:

Class<? extends Action<ClientInterface>> c = ClientAction.class; 
Action<ClientInterface> action = c.newInstance(); 

這消除了雙方的演員和警告,在引入非泛型類型的價格,因此您可以使用.class來獲得足夠精確類型的Class對象。

+0

ClientAction.class ????它來自哪裏? – 2016-02-18 08:02:31