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