实例化泛型类型时发出警告

时间:2012-07-04 07:24:47

标签: java generics

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

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通过以下消息在代码上显示警告(准备clazz变量行时出现黄线):Type safety: Unchecked cast from Type to Class<X>

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

@SuppressWarnings("unchecked")

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

3 个答案:

答案 0 :(得分:2)

警告就是这样。一个警告。有时警告是无关紧要的,有时它们不是。它们习惯于引起你注意编译器认为可能存在问题的东西,但可能不是。

在演员阵容的情况下,在这种情况下总是会发出警告。如果您完全确定某个特定的演员阵容是安全的,那么您应该考虑在该行之前添加这样的注释:

@SuppressWarnings (value="unchecked")

参考Type safety: Unchecked cast

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

ftom2是正确的 - 在通常情况下,如果出现此警告,您应该在演员之前执行实例检查(instanceof)。但在你的情况下,这是不可能的,因为Java中的泛型是通过擦除来实现的。 Class<X>不是reified类型,因此无法使用它进行检查,只有关闭警告的方法是使用@SuppressWarnings(value = "unchecked")。 要了解有关泛型的更多信息,您可以使用this book。