![](/img/trans.png)
[英]“class A <T extends SomeClass<T>>” works differently from class B <T extends SomeInterface<T>> ? (Yes)
[英]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.