亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

? extends T與? super T

曹金海 / 2838人閱讀

摘要:表示類的允許范圍是及其子類表示類的允許范圍是及其父類。存值只要能保證存放類是指定類及其子類即可。取值取得的默認(rèn)類型為上界,的默認(rèn)類型為所有類的父類。

概覽

集合框架的源碼經(jīng)常見到“? extends E”、“? super T”。本篇文章以實(shí)例+注釋講講“有限通配符的參數(shù)化類型”的創(chuàng)建、存值以及取值。

這兩種都是限定類的取值范圍的寫法?!? extends T”表示類的允許范圍是T及其子類;“? super T”表示類的允許范圍是T及其父類。也就是new的時(shí)候受到此約束。

存值:只要能保證存放類是指定類及其子類即可。null不受“? extends/super T”約束。

取值:“? extends T”取得的默認(rèn)類型為上界T,“? super T”的默認(rèn)類型為所有類的父類Object。

Demo
package generic;

import java.util.PriorityQueue;

public class Extend {
    public static void main(String[] args) {
        // ? extends T,T為臨界類
        // extends限定了類的上界
        // Type mismatch: cannot convert from PriorityQueue to PriorityQueue
        //PriorityQueue pq = new PriorityQueue();
        PriorityQueue pq = new PriorityQueue();
        
        // 無(wú)法直接放入,因?yàn)闊o(wú)法保證存放類與Son的關(guān)系
        //The method add(capture#1-of ? extends Parent) in the type PriorityQueue is not applicable for the arguments (Son)
        //pq.add(new Son()));
        //The method add(capture#1-of ? extends Parent) in the type PriorityQueue is not applicable for the arguments (Son)
        //pq.add(new Parent());
        //null不受類型限定,但PriorityQueue不允許為空,會(huì)拋出空指針異常
        //pq.add(null);
        
        // 間接存放
        PriorityQueue pqs = new PriorityQueue();
        pqs.add(new Son("1"));
        pqs.add(new Son("2"));
        pqs.add(new Son("3"));
        pqs.add(new Son("4"));
        
        PriorityQueue pq1 = pqs;
        
        //取值
        Son s = (Son) pq1.poll();
        Parent p = pq1.poll();
        //Daughter d = (Daughter) pq1.poll(); // 編譯通過,執(zhí)行報(bào)錯(cuò)。類型轉(zhuǎn)換異常。
        Person pp= pq1.poll();
        
        System.out.println(s.getName());
        System.out.println(p.getName());
        System.out.println(pp.getName());
    }
}
package generic;

import java.util.PriorityQueue;

public class Super {
    public static void main(String[] args) {
        // ? super T,T為臨界類
        // super限制了下界
        // Type mismatch: cannot convert from PriorityQueue to PriorityQueue
        //PriorityQueue pq = new PriorityQueue();
        PriorityQueue pq = new PriorityQueue();
        
        // 可存放臨界類的子類,因?yàn)槿我弧? super T”也是其父類
        pq.add(new Son("1"));
        pq.add(new Daughter("2"));
        pq.add(new Parent("3"));
        // The method add(capture#4-of ? super Parent) in the type PriorityQueue is not applicable for the arguments (Person)
        //pq.add(new Person("4"));

        // 取值(默認(rèn)Object,類型順序必須與存放對(duì)應(yīng)或者是其父類,否則類型轉(zhuǎn)換錯(cuò)誤)
        /*Parent p = (Parent) pq.poll();
        Daughter d = (Daughter) pq.poll();
        Son s = (Son) pq.poll();*/
        
        Parent p = (Parent) pq.poll();
        Parent d = (Parent) pq.poll();
        Parent s = (Parent) pq.poll();
        
        System.out.println(d.getName());
        System.out.println(p.getName());
        System.out.println(s.getName());
    }
}
package generic;

public class Person implements Comparable{
    protected String name;

    public Person(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int compareTo(Person o) {
        return o.name.compareTo(this.name);
    }
}
package generic;

public class Parent extends Person{
    private String name;

    public Parent(String name) {
        super(name);
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
package generic;

public class Son extends Parent{
    private String name;

    public Son(String name) {
        super(name);
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
package generic;

public class Daughter extends Parent{
    private String name;

    public Daughter(String name) {
        super(name);
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
說(shuō)點(diǎn)什么

針對(duì)以上特性,java中有“PECS(“Producer Extends,Consumer Super”)”的說(shuō)法。即如果要用參數(shù)化類型表示生產(chǎn)者,就使用;如果表示消費(fèi)者,就使用。

更多有意思的內(nèi)容,歡迎訪問筆者小站: rebey.cn

推薦閱讀

Java 泛型: 什么是PECS(Producer Extends, Consumer Super)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/70173.html

相關(guān)文章

  • Java 之泛型通配符 ? extends T ? super T 解惑

    摘要:簡(jiǎn)述大家在平時(shí)的工作學(xué)習(xí)中肯定會(huì)見過不少如下的語(yǔ)句我們都知道上面的代碼時(shí)關(guān)于泛型的那么這兩個(gè)不同的寫法都有什么區(qū)別呢首先說(shuō)到的泛型我們必須要提到的是泛型的類型擦除機(jī)制中的泛型基本上都是在編譯器這個(gè)層次來(lái)實(shí)現(xiàn)的在生成的字節(jié)代碼中是不包含泛型中 簡(jiǎn)述 大家在平時(shí)的工作學(xué)習(xí)中, 肯定會(huì)見過不少如下的語(yǔ)句: List 就表示了泛型參數(shù)是某個(gè)類型, 只不過我們并不知道它的具體類型時(shí)什么.List...

    woshicixide 評(píng)論0 收藏0
  • 《深入理解ES6》筆記—— JavaScript中的類class(9)

    摘要:新建一個(gè)類該函數(shù)返回一個(gè)類的實(shí)例給函數(shù)傳入通過立即調(diào)用類構(gòu)造函數(shù)可以創(chuàng)建單例。派生類是指繼承自其它類的新類。在構(gòu)造函數(shù)中訪問之前要調(diào)用,負(fù)責(zé)初始化。在構(gòu)造函數(shù)中使用通常表示當(dāng)前的構(gòu)造函數(shù)名。 ES5中的近類結(jié)構(gòu) ES5以及之前的版本,沒有類的概念,但是聰明的JavaScript開發(fā)者,為了實(shí)現(xiàn)面向?qū)ο?,?chuàng)建了特殊的近類結(jié)構(gòu)。 ES5中創(chuàng)建類的方法:新建一個(gè)構(gòu)造函數(shù),定義一個(gè)方法并且賦值...

    gggggggbong 評(píng)論0 收藏0
  • 《深入理解ES6》筆記—— JavaScript中的類class(9)

    摘要:新建一個(gè)類該函數(shù)返回一個(gè)類的實(shí)例給函數(shù)傳入通過立即調(diào)用類構(gòu)造函數(shù)可以創(chuàng)建單例。派生類是指繼承自其它類的新類。在構(gòu)造函數(shù)中訪問之前要調(diào)用,負(fù)責(zé)初始化。在構(gòu)造函數(shù)中使用通常表示當(dāng)前的構(gòu)造函數(shù)名。 ES5中的近類結(jié)構(gòu) ES5以及之前的版本,沒有類的概念,但是聰明的JavaScript開發(fā)者,為了實(shí)現(xiàn)面向?qū)ο?,?chuàng)建了特殊的近類結(jié)構(gòu)。 ES5中創(chuàng)建類的方法:新建一個(gè)構(gòu)造函數(shù),定義一個(gè)方法并且賦值...

    Jason 評(píng)論0 收藏0
  • 讓我們一起來(lái)構(gòu)建一個(gè)模板引擎(三)

    摘要:在上篇文章中我們的模板引擎實(shí)現(xiàn)了對(duì)和對(duì)支持,同時(shí)在文章的最后我給大家留了一個(gè)問題如何實(shí)現(xiàn)支持和的標(biāo)簽功能。在本篇文章中我們將一起來(lái)動(dòng)手實(shí)現(xiàn)這兩個(gè)功能。 在 上篇文章 中我們的模板引擎實(shí)現(xiàn)了對(duì) if 和 for 對(duì)支持,同時(shí)在文章的最后我給大家留了一個(gè) 問題:如何實(shí)現(xiàn)支持 include 和 extends 的標(biāo)簽功能。 在本篇文章中我們將一起來(lái)動(dòng)手實(shí)現(xiàn)這兩個(gè)功能。 include in...

    3fuyu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<