2012-07-04 99 views
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显示的代码(下线上的黄色准备clazz警告变线)此消息:Type safety: Unchecked cast from Type to Class<X>

我以下标注临时加载在上述的方法xFromI

@SuppressWarnings("unchecked") 

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

回答

1

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

1

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

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

2

警告就是这样。一个警告。有时候警告是无关紧要的,有时它们不是。他们习惯于把注意力放在编译器认为可能成为问题的东西上,但可能不是。

对于剧组,在这种情况下总是会发出警告。如果你是绝对肯定的是,特定的广播将是安全的,那么你应该考虑只前行加入这样的注释:

@SuppressWarnings (value="unchecked") 

参考Type safety: Unchecked cast