![](/img/trans.png)
[英]Why can't I pass an object of type T to a method on an object of type <? extends T>?
[英]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>
! 讓我們遵循規范。
給定泛型類型聲明C <F 1 ,...,F n >,參數化類型C <T 1 ,...,T n >的直接超類型全部如下:
- C <S 1 ,...,S n >,其中S i包含T i 。
類型參數T 1被稱為包含另一個類型參數T 2 ,寫為T 2 <= T 1 ,如果由T 2表示的類型集合可證明是在反身和傳遞下由T 1表示的類型集的子集關閉以下規則:
- T <=? 延伸T.
因此,我們知道? extends URLClassLoader
? extends URLClassLoader
包含URLClassLoader
, Class<? 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.