两个类型参数为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
答案 0 :(得分:0)
第一个示例与协方差无关,而是A.class
类型为Class<A>
(原始类型A
)和Class<? extends A<?>>
期望{ {1}}。更改为:
A
使其编译。
第三个示例由于类型擦除而编译。可以将Class<? extends A> clz1 = A.class; // ok with warning
分配给B<?>
,因为类型参数将在分配中被删除。