中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

Javageneric中通配符的理解有哪些

本篇文章給大家分享的是有關(guān)Java generic中通配符的理解有哪些,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

成都創(chuàng)新互聯(lián)從2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站建設(shè)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元萬安做網(wǎng)站,已為上家服務(wù),為萬安各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792

置換原則

結(jié)合Java本身的一些面向?qū)ο蟮奶匦?,我們很容易理解這么一個(gè)置換原則:

一個(gè)指定類型的變量可以被賦值為該類型的任何子類;一個(gè)指定某種類型參數(shù)的方法可以通過傳入該類型的子類來進(jìn)行調(diào)用。

總的來說,就是說我們使用的任何類型變量都可以用該類型的子類型來替換。

泛型中一種錯(cuò)誤的繼承關(guān)系

在泛型的編程中,我們考慮到子類型關(guān)系的時(shí)候,容易把一種關(guān)系給弄混淆,并錯(cuò)誤的采用置換原則。

比如說:

List<Integer> ints = new ArrayList<Integer>();  ints.add(1);  ints.add(2);  List<Number> nums = ints; // compile error

在這段代碼中,我們看到類型參數(shù)Integer是Number的子類型,就容易想當(dāng)然的認(rèn)為List<Integer>也是List<Number>的子類。實(shí)際上并不是。所以才會導(dǎo)致類型不匹配,產(chǎn)生編譯時(shí)錯(cuò)誤。

有點(diǎn)時(shí)候,我們覺得,這樣的轉(zhuǎn)換看似不能用到一個(gè)好處,就是利用對象之間繼承的關(guān)系。要是我們能有一個(gè)列表,它既能處理某種類型的數(shù)據(jù),還能處理該類型的所有子類型的數(shù)據(jù),這樣豈不是既能用到泛型的好處又可以用到對象關(guān)系的好處么?于是在這里就引出了通配符(wildcard)。

通配符(Wildcard)

在Java類庫中Collection接口定義中有一個(gè)用到通配符的方法:

interface Collection<E> {  ...  public boolean addAll(Collection<? extends E> c);  ...  }

在addAll方法的描述里,可以接受Collection類型的參數(shù)。其中Collection中的類型參數(shù)可以為任何繼承E的子類型。

因此,我們可以在實(shí)際代碼中這么使用:

List<Number> nums = new ArrayList<Number>();  List<Integer> ints = Arrays.asList(1, 2);  List<Double> dbls = Arrays.asList(2.78, 3.14);  nums.addAll(ints);  nums.addAll(dbls);

在代碼中我們可以看到,List<Integer>和List<Double>都是Collection<? extends Number>類型的子類。所以上面的方法中可以將Integer和Double兩種類型的List傳入到方法中。

通配符使用限制1:

使用通配符的泛型數(shù)據(jù)類型比較有意思,既然前面我們可以將其作為方法聲明的參數(shù),那么是否可以將它作為一個(gè)變量類型來直接創(chuàng)建變量呢?

看如下代碼:

List<? extends Number> nums = new ArrayList<Integer>(); //compile error

實(shí)際上上面這段代碼是編譯通不過的。

通配符使用限制2:

既然不能用來直接創(chuàng)建變量對象,那么再看下面這段代碼:

List<Integer> ints = new ArrayList<Integer>();  ints.add(1);  ints.add(2);  List<? extends Number> nums = ints;  nums.add(3.14); // compile error

這段代碼的第5行會導(dǎo)致編譯錯(cuò)誤。在第4行代碼中,我們將ints賦值給nums,表面上nums聲明為一個(gè)List<Integer>的父類型,所以第4行編譯正常。為什么第5行代碼會出錯(cuò)呢?表面上看來,既然nums類型可以接受繼承自Number的所有參數(shù),那加一個(gè)Double類型的數(shù)據(jù)應(yīng)該是沒問題的。實(shí)際上我們再考慮一下這樣會帶來的問題:

nums本來引用的是一個(gè)繼承自該類型的List<Integer>,如果我們允許加入Double類型的數(shù)據(jù)的話,那么ints這個(gè)Integer的List里面就包含了Double的數(shù)據(jù),當(dāng)我們使用ints的時(shí)候,和我們所期望的只包含Integer類型的數(shù)據(jù)不符合。

因此,這段代碼也說明了一個(gè)問題,就是在? extends E這種通配符引用的數(shù)據(jù)類型中,如果向其中增加數(shù)據(jù)操作的話會有問題。所以向其中增加數(shù)據(jù)是不允許的。但是我們可以從其中來讀取數(shù)據(jù)。

總結(jié):

1:通配符修飾的泛型不能用來直接創(chuàng)建變量對象。

2:通配符修飾相當(dāng)于聲明了一種變量,它可以作為參數(shù)在方法中傳遞。這么做帶來的好處就是我們可以將應(yīng)用于包含某些數(shù)據(jù)類型的列表的方法也應(yīng)用到包含其子類型的列表中。相當(dāng)于可以在列表中用到一些面向?qū)ο蟮奶匦浴?/p>

以上就是Java generic中通配符的理解有哪些,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁題目:Javageneric中通配符的理解有哪些
本文URL:http://m.rwnh.cn/article48/jipehp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、用戶體驗(yàn)企業(yè)網(wǎng)站制作、App設(shè)計(jì)商城網(wǎng)站、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司
江西省| 大连市| 涟水县| 吉木萨尔县| 方正县| 莒南县| 蒲江县| 萍乡市| 哈密市| 南宫市| 廊坊市| 泰来县| 临夏县| 怀集县| 桂林市| 罗江县| 宜兰市| 阿尔山市| 海城市| 潮州市| 德令哈市| 迁西县| 泊头市| 田东县| 秀山| 南部县| 衡阳县| 周宁县| 阿巴嘎旗| 普格县| 万安县| 徐汇区| 鄄城县| 马山县| 紫云| 乡城县| 新晃| 西和县| 怀安县| 鱼台县| 澄城县|