簡體   English   中英

為什么不能分配我 <? extends Type> 至 <Type> ?

[英]Why can't assign I <? extends Type> to <Type>?

以下陳述:

URLClassLoader ucl = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class<URLClassLoader> uclc = ucl.getClass();

失敗並出錯:

Type mismatch: cannot convert from Class<capture#2-of ? extends URLClassLoader> to Class<URLClassLoader>

我為什么需要演員?

我發現了幾個帖子解釋了為什么你不能反過來(將T分配給a),但那種(有點)是顯而易見的。

注意:我在eclipse Luna下編碼,所以我不知道它是否是Luna Quirk,或者是否有一些我在仿制葯中真的不理解的東西。

協方差與逆變與不變性

  • Class<? extends URLClassLoader> Class<? extends URLClassLoader>不變的

結果是,

Class<? extends URLClassLoader> Class<? extends URLClassLoader> 不是 Class<URLClassLoader> 的子類型


在Java中,變量可以包含相同類型或子類型的實例的引用。

因此,

Class<URLClassLoader> uclc = ucl.getClass();

無效

另一方面,

Class<? extends URLClassLoader> uclc = ucl.getClass();

有效的

為什么不能指定我<? 將Type>擴展為<Type>?

因為實際上<? extends Type> <? extends Type><Type>的超<Type> 讓我們遵循規范。

4.10.2類和接口類型的子類型

給定泛型類型聲明C <F 1 ,...,F n >,參數化類型C <T 1 ,...,T n >的直接超類型全部如下:

  • C <S 1 ,...,S n >,其中S i包含T i

4.5.1。 參數化類型的類型參數

類型參數T 1被稱為包含另一個類型參數T 2 ,寫為T 2 <= T 1 ,如果由T 2表示的類型集合可證明是在反身和傳遞下由T 1表示的類型集的子集關閉以下規則:

  • T <=? 延伸T.

因此,我們知道? extends URLClassLoader ? extends URLClassLoader包含URLClassLoaderClass<? extends URLClassLoader> Class<? extends URLClassLoader>Class<URLClassLoader>的超類型。

由於在賦值上下文中不允許縮小引用轉換 ,因此會發生編譯錯誤。

另請注意,這意味着允許反向分配:

Class<URLClassLoader> concrete = URLClassLoader.class;
Class<? extends URLClassLoader> wildcard = concrete;

暫無
暫無

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

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