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

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

Yar*_*ena 6

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


not*_*oop 5

因为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".