Java:Generic cast down生成警告,为什么?

时间:2009-09-07 21:44:22

标签: 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>

在B类中,我只对使用类型为A的Generic实例感兴趣。这个警告​​表明我需要将Generic参数存储为T而不是A.

但这意味着我还必须声明B泛型,这似乎使事情变得比他们需要的更复杂。

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

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

为了说明这一点,请考虑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`。