4

我不明白为什么以下代码会生成警告。

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 泛型,这似乎使事情变得比需要的更复杂。

4

2 回答 2

6

这不是向下转换,因为 Java 泛型是不变的:即使 T 是 A 的子类型,它也不是的子类型。如果您只需要返回 A 的泛型方法,则可以Generic<T>在B 构造函数和存储的字段中使用通配符参考资料。Generic<A>Generic<? extends A>

于 2009-09-07T21:53:01.040 回答
5

因为 aGeneric<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类型声明为“通用”。

于 2009-09-07T22:21:41.390 回答