亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

Java泛型的PE和CS原則說明

發布時間:2021-09-04 11:48:46 來源:億速云 閱讀:181 作者:chen 欄目:大數據

這篇文章主要講解了“Java泛型的PE和CS原則說明”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java泛型的PE和CS原則說明”吧!

什么是 PE,CS

PE,CS全稱是producer extends,consumer super的縮寫,這是 Joshua Bloch 在 Effective Java 一書 中引入的一個略顯奇怪的術語,但有助于理解泛型的用法。換言之,參數化類型代表 生產者(producer)則使用 extends, 代表消費者(consumer)則使用 super

PE 原則

簡單來說, PE 表示,如果你的方法只是想從集合獲取值,并且希望集合的類型范圍是T及其子類,那么泛型可以定義為 ? extends T

了解泛型的同學應該知道 extends 是上界通配符,使用了上界通配符,只能讀取值,不能寫入值,取值的的類型是T

只能取值不能寫入的就是生產者,有人可能有點理解了,我們來個更詳細的解釋,舉個栗子

假設,我們有個水果的對象,水果類有個addAll方法,用來將另一個水果集合,放入到水果對象內

class Fruit{
    private List<Fruit> fruits = new LinkedList<>();

    public void addAll(List<Fruit> fruits){
        for (Fruit fruit : fruits) {
            this.fruits.add(fruit);
        }
    }
}

現在,我們需求變了,有蘋果,香蕉分別繼承了水果這個類,如果我么將蘋果或者香蕉集合直接放入addAll方法,會編譯報錯,因為蘋果集合,不是水果集合

public static void main(String[] args){
        List<Apple> appleList = new LinkedList<>();
        Fruit fruit = new Fruit();
        // 編譯報錯
        fruit.addAll(appleList);
}

class Apple extends Fruit{
}
class Banana extends Fruit{
}

如果我們要放進去怎么辦,使用上界通配符,修改addAll方法,使用了上界通配符后,元素只能讀,不能寫,傳入的集合類型范圍是Fruit或者其子類集合

public void addAll(List<? extends Fruit> f){
    for (Fruit fruit : f) {
        this.fruits.add(fruit);
    }

有人會問了,這個上界通配符,跟PE有什么關系? 當然有,PEproducer extends的縮寫,我們仔細看看,對于addAll方法來說,只是要消費入參,那么入參就是生產者,說著這,估計很多人已經明白了

PE是針對方法來說的,如果某個方法的入參,需要一個生產者,并且范圍是泛型的子類,那么使用上界通配符extends

CS 原則

簡單來說, CS 表示,如果你的方法只是想往集合寫入值,并且集合的類型范圍希望是T及其父類,那么泛型可以定義為 ? super T 來表示

了解泛型的同學應該知道,super表示下界通配符,使用了下界通配符,只能寫入值,不能取值,寫入的值必須是T或者其子類

只能寫入,不能取出就是消費者,有人可能有點理解了,我們來個更詳細的解釋,舉個例子

我們還是沿用上面的例子,我們進行改造一下,蘋果類有個addAll方法,傳入一個蘋果集合,將蘋果對象放入這個集合里面

public class Apple extends Fruit{

    private Apple apple = new Apple();

    public void addAll(List<Apple> apples){
        apples.add(apple);
    }
}

現在需求變了,我們變更,我們想傳入一個更大的水果集合,將蘋果添加入水果集合里面,畢竟蘋果是屬于水果的子類,我們直接將水果集合傳入進去,會編譯報錯,我們改造一下addAll方法,使用下界通配符將它的接收范圍擴大,傳入的集合范圍是Apple或者其父類集合

public void addAll(List<? super Apple> apples){
    apples.add(apple);
}

有人會問了,這個下界通配符,跟CS有什么關系? 當然有,CSconsumer super的縮寫,對于addAll方法來說,只要是將東西放進到入參內,那么入參就是消費者

CS也是針對方法來說的,如果某個方法的入參需要消費方法內的東西,入參并且是泛型的父類,那么使用下界通配符super

總結

如果進行簡單的歸納,那就是

  • 只從方法入參集合獲取值,那么使用 extends

  • 只從方法入參集合寫入值,那么使用 super

感謝各位的閱讀,以上就是“Java泛型的PE和CS原則說明”的內容了,經過本文的學習后,相信大家對Java泛型的PE和CS原則說明這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

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

AI

获嘉县| 滦南县| 德庆县| 海兴县| 竹山县| 大冶市| 南康市| 尖扎县| 万宁市| 舞阳县| 临西县| 临湘市| 基隆市| 徐州市| 镇安县| 浦东新区| 盖州市| 平远县| 乌兰察布市| 雷波县| 长子县| 凤阳县| 梁平县| 石渠县| 韩城市| 屏山县| 建水县| 水富县| 台东市| 惠水县| 青州市| 饶河县| 英吉沙县| 商南县| 金门县| 大名县| 麻栗坡县| 广丰县| 方山县| 株洲县| 扎赉特旗|