具有类型参数 T 的两个类:
class A<T>{}
class B<T> extends A<T>{}
类型 A 和 B 分别是不变的,并且 A 可以从具有相同泛型类型的 B 分配。
A<String> a = new B<String>();
对于可从 A.class 和 B.clas 分配的类变量,不允许使用协方差。它似乎是反变体。类泛型规则不同?
Class<? extends A<?>> clz1 = A.class; // error with a type mismatch
Class<? extends A<?>> clz2 = B.class; // error with a type mismatch
Class<A> clz3 = A.class; // ok with a raw type warning
Class<B> clz4 = B.class; // ok with a raw type warning
Class<? super B<?>> clz5 = A.class; // ok
Class<? super B<?>> clz6 = B.class; // ok
最佳答案
第一个样本不是关于协方差,而是关于 A.class
的类型的事实。是 Class<A>
(原始类型 A
)和 Class<? extends A<?>>
期望 A
的参数化版本.更改为:
Class<? extends A> clz1 = A.class; // ok with warning
使其编译。
第三个示例由于类型删除而编译。
B<?>
可以分配给A
因为类型参数将在赋值中被删除。
关于java - 由 'B<T> extends A<T>' 定义,A Class<T> 变量似乎是逆变的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59212503/