【问题标题】:Java: Generic casting down generates warning, why?Java:通用强制转换会产生警告,为什么?
【发布时间】:2009-09-07 21:44:22
【问题描述】:
我不明白为什么下面的代码会产生警告。
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 泛型,这似乎使事情变得比他们需要的更复杂。
【问题讨论】:
标签:
java
generics
compiler-warnings
【解决方案1】:
这不是向下转换,因为 Java 泛型是不变的:Generic<T> 不是 Generic<A> 的子类型,即使 T 是 A 的子类型。如果您只需要返回 A 的泛型方法,则可以使用通配符Generic<? extends A> 在 B 构造函数和存储引用的字段中。
【解决方案2】:
因为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!
编译器不允许这种转换,因为它可能会导致原始列表损坏。 JVM 不会在运行时强制执行通用边界要求。
这里的解决方案是将字段c类型声明为
“通用”。