簡體   English   中英

由 &#39;B 定義<T>擴展 A<T> &#39;, 一類<T>變量似乎是逆變的

[英]Defined by 'B<T> extends A<T>', A Class<T> variable seem to be contravariant

具有類型參數 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<?>> Class<? extends A<?>>需要A的參數化版本。 更改為:

Class<? extends A> clz1 = A.class; // ok with warning

使它編譯。

由於類型擦除,第三個示例編譯。 B<?>可以賦值給A因為類型參數會在賦值中被擦除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM