类型安全:未选中的对象
投我尝试对象转换我的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();
}
[...]
感谢您的帮助
是 - 这是一个自然的type erasure的后果。如果o
实际上是不会被投被捕获的Action<String>
实例 - 你只看到了问题,当您尝试使用它,通过在ClientInterface
而不是字符串。
可以使用摆脱警告:
@SuppressWarnings("unchecked")
的功能注释,但你不能轻易理清潜在的问题:(
不要担心它。因为Java编译器没有办法知道,什么是真正的对象的类型。
你已经失去了,因为删除的信息类型(即,参数化类型已经被删除),因此警告。你可以除了清理周围的代码之外,别无所求泛型更频繁使用,所以您可以传递泛型类型信息并避免投射。
警告意味着,编译器不能保证类型安全,即使铸造在运行时工作正常。由于擦除,在运行时,该投射只是对Action的投射。根据预期,基础泛型类可能不是ClientInterface类型。在这种情况下,问题将在稍后出现(可能甚至更晚),作为ClassCastException。
在我建议抑制由以下编译器指令这个特定的警告这种特殊情况下:
@SuppressWarnings("unchecked")
像往常一样,乔恩斯基特是正确的。
为了详细说明他的回答的未轻易部分:
鉴于
class ClientAction implements Action<ClientInterface> {}
你可以写:
Class<? extends Action<ClientInterface>> c = ClientAction.class;
Action<ClientInterface> action = c.newInstance();
这消除了双方的演员和警告,在引入非泛型类型的价格,因此您可以使用.class
来获得足够精确类型的Class
对象。
ClientAction.class ????它来自哪里? – 2016-02-18 08:02:31
'c'的类型是什么? – meriton 2010-04-07 13:21:10
关于c的类型: 类> c = null; c = Class.forName(className); 无论如何,我有足够明确的答案!谢谢大家,是否有可能以某种方式关闭问题或将问题标记为已回答? – Matthew 2010-04-07 14:28:40
是的,使用您偏好答案左边的绿色复选标记。的 – meriton 2010-04-07 15:44:47