2009-09-07 51 views
4

我不明白为什么下面的代码会产生警告。Java:泛型下拉会生成警告,为什么?

interface Generic<T> { 
} 

interface A { 
} 

class B { 
    Generic<A> c; 

    <T extends A> B(Generic<T> a) { 
     c = (Generic<A>) a; //warning here 
    } 

} 

//Unchecked cast from Generic<T> to Generic<A> 

在B类我只是在使用的类型为A.一般的情况下,该警告表明,我需要的通用参数存储为一件T而非A.

感兴趣,但是这意味着我将不得不声明B通用,这似乎使事情变得比他们需要的更复杂。

+0

当你不施放时会发生什么? – aperkins 2009-09-07 21:49:47

+0

类型不匹配错误 – Mike 2009-09-07 21:50:17

回答

6

这不下来,铸造,因为Java泛型是不变的:Generic<T>不是Generic<A>亚型即使T是A的子类型。如果你只需要返回一个通用的方法,你可以在B之间使用通配符Generic<? extends A>构造函数和存储引用的字段中。

5

因为即使TA的子类型,Generic<T>也不是Generic<A>的子类型。

为了说明这一点,考虑ObjectString实例:

List<String> listOfStrings = new ArrayList<String>(); 
List<Object> listOfObjects = (List<Object>)listOfStrings; // invalid 
listOfObjects.add(new Date()); 
// now listOfStrings contain a date! 

编译器不允许投,因为它可能会导致原始列表的腐败。 JVM不会在运行时强制实施泛型边界要求。

此处的解决方案是声明c类型为 'Generic`。

+1

Java中泛型风险的经典示例 – 2009-09-07 22:37:49

相关问题