0

我有一个用于实例化泛型类型的代码片段,如下所示:

public class GenericMessageMapper<I ,X>
{
   public X xFromI(I imf)
   {
      // do thing by imf argument
      Class<X> clazz = (Class<X>)((ParameterizedType)
                                   this.getClass()
                                       .getGenericSuperclass())
                                       .getActualTypeArguments()[1];
      X x = clazz.newInstance(); 
   }
}

上面的代码工作正常,但通过此消息在代码上显示警告(准备变量行MyEclipse上的黄色下划线):clazzType safety: Unchecked cast from Type to Class<X>

我在方法的上面临时添加了以下注释xFromI

@SuppressWarnings("unchecked")

此警告的原因是什么,解决方案是什么?

4

3 回答 3

2

警告就是这样。一个警告。有时警告是无关紧要的,有时则不是。它们用于提醒您注意编译器认为可能是问题但可能不是问题的事情。

在强制转换的情况下,它总是会在这种情况下发出警告。如果您绝对确定特定演员表是安全的,那么您应该考虑在该行之前添加这样的注释:

@SuppressWarnings (value="unchecked")

参考类型安全:未经检查的演员表

于 2012-07-04T07:36:10.213 回答
1

这仅意味着该类的类型仅​​在运行时才知道,因此可能会出现您认为应该获得 X 类型的类但实际上它是其他类型的情况(它在编译时不知道)因为 X 可以是任何类型)。

基本上你可以忽略这个警告。

于 2012-07-04T07:34:15.833 回答
1

ftom2是正确的 - 在通常情况下,您应该在转换instanceof之前执行实例检查 ( ),以防出现此警告。但在您的情况下,这是不可能的,因为 Java 中的泛型是通过擦除实现的。Class<X>不是具体类型,因此不可能使用它,例如检查,关闭警告的唯一方法是使用@SuppressWarnings(value = "unchecked"). 要了解有关泛型的更多信息,您可以使用本书。

于 2012-07-04T07:56:30.883 回答