java - 由 'B<T> extends A<T>' 定义,A Class<T> 变量似乎是逆变的

标签 java generics

具有类型参数 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/

相关文章:

delphi - 为什么 TGeneric<Base> 和 TGeneric<Descendant> 类型不兼容?

swift - 我怎样才能编写一个函数,假设它是一个可选类型,那么它会在 swift 中解开通用属性?

c# - 如何解决Operator '!=' cannot be applyed to operands of type 'T' and 'T'

ios - Swift:检查有一个协议(protocol)并像在 Java 中一样使用 getter

java - 有人可以纠正我理解这段代码的方式,因为输出与我的想法不同吗?

java - 如何允许两种类型的数据作为参数

java - 优化在android上运行youtube视频的方式

java - 使用 Elasticsearch 创建具有 .keyword 后缀的字段的 Hibernate 搜索

"indexed"属性文件的 Java API

java - "Hello, world!"- 无法找到或加载主类