我不明白为什么以下代码会生成警告。
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的Generic实例感兴趣。这个警告表明我需要将Generic参数存储为T而不是A.
但这意味着我还必须声明B泛型,这似乎使事情变得比他们需要的更复杂。
答案 0 :(得分:6)
这不是向下转换,因为Java泛型是不变的:Generic<T>
不是Generic<A>
的子类型,即使T是A的子类型。如果只需要返回A的泛型方法,您可以在B构造函数和存储引用的字段中使用通配符Generic<? extends A>
。
答案 1 :(得分:5)
因为Generic<T>
不是Generic<A>
的子类型,即使T
是A
的子类型。
为了说明这一点,请考虑String
的{{1}}实例:
Object
编译器不允许该转换,因为它可能导致原始列表损坏。 JVM在运行时不强制执行通用边界要求。
此处的解决方案是将字段List<String> listOfStrings = new ArrayList<String>();
List<Object> listOfObjects = (List<Object>)listOfStrings; // invalid
listOfObjects.add(new Date());
// now listOfStrings contain a date!
类型声明为
“Generic`。