中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java泛型中逆變和協變的概念

發布時間:2021-08-30 11:00:29 來源:億速云 閱讀:143 作者:chen 欄目:編程語言

本篇內容主要講解“Java泛型中逆變和協變的概念”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java泛型中逆變和協變的概念”吧!

正文

OK,今天5分鐘短文就讓咱們聊一聊逆變和協變這倆個概念。

1、基礎概念

其實它們倆的概念很好理解。接下來讓我們仔細讀一遍下邊的這一段話:

逆變與協變用來描述類型轉換后的繼承關系。如果A、B表示類型,f(...)表示類型轉換,≤表示繼承關系(比如,A≤B表示A是B的子類)

如果f(...)是逆變的,那么當A≤B時則f(B)≤f(A)成立

如果f(...)是協變的,那么當A≤B時則f(A)≤f(B)成立

額外補充一條:如果f(...)是不變的,那么當A≤B時則f(B)與f(A)沒有任何關系

2、代碼場景

如果大家充分理解了上邊的話,其實就能想到咱們日常代碼中的例子:數組就是一種協變;泛型是不變的。上代碼:

public class A extends B {}  public class B {}     public void test() {  B[] arrs = new A[66];  List<B> list = new ArrayList<A>();  }

這段代碼是編不過的:

Java泛型中逆變和協變的概念

因為數組是協變的,所以 A[]是 B[]的子類;而泛型不是,所以 List并不是 List的子類。

3、通配符的意義

因為這個原因的存在,所以才有了通配符。

3.1、協變-上限通配符

代碼改成這個樣子就可以正常編譯了:

Java泛型中逆變和協變的概念

通配符的存在,讓泛型產生了協變,讓 List可以變成 List的子類。不過我猜經驗豐富的同學已經知道,這樣搞“沒什么卵用”,因為:

Java泛型中逆變和協變的概念

我們發現,這樣搞完。對于 list變量來說,我們只能 get()不能  add()!一時接受不了?其實這里也很好理解,協變之后對于list來說,我可以指向很多 List的子類。

假設此時我們可以隨意 add(),那么對于運行期來說簡直是災難:因為我可以隨意的 add(newA());add(newC())。如果這種情況存在那么我  get()的時候,是不是只能把它當做 B來使用,因為這里有可能有 A也有可能有 C...

這樣搞完全沒有意義...因此也就有了下邊的內容:逆變-下限通配符

3.2、逆變-下限通配符

直接上代碼:

public class A extends B {}  public class B {}  public class C extends B {}  public class D extends A {}     public void test2(List<? super A> list){  list.add(new A());  list.add(new B());  list.add(new C());  list.add(new D());  }

此時我們會發現:我們可以 add(), A及其子類。而這種實現就脫胎于咱們逆變這個概念。

Java泛型中逆變和協變的概念

到此,相信大家對“Java泛型中逆變和協變的概念”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

柯坪县| 和平区| 克拉玛依市| 白山市| 惠安县| 巨鹿县| 大足县| 来凤县| 黑龙江省| 昭苏县| 抚州市| 姚安县| 锡林郭勒盟| 景东| 东港市| 张家界市| 荥经县| 托克逊县| 荆门市| 乡城县| 溆浦县| 云南省| 丹凤县| 神木县| 揭东县| 桂东县| 繁昌县| 新竹市| 万山特区| 布拖县| 吉安县| 灯塔市| 临夏市| 阳信县| 方山县| 成都市| 梅河口市| 洪雅县| 报价| 苏尼特右旗| 望谟县|