2010-04-07 59 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