Collections.sort()(二)----理解泛型<熄攘? super T>

下面一段話來自一位知乎用戶的回答,特摘抄如下:

假設(shè)現(xiàn)在有這么一個(gè)類的繼承樹垃它,Plant -> Fruit -> Apple -> RedApple。
List<? extends Fruit> appList2的意思,是一個(gè)列表国拇,這個(gè)列表里面的元素是Fruit的某個(gè)子類T洛史,那么在從appList2中取出一個(gè)元素時(shí),編譯器會(huì)自動(dòng)把這個(gè)元素轉(zhuǎn)型為T酱吝。那么現(xiàn)在假設(shè)T是RedApple也殖,很顯然你往這樣一個(gè)appList2中add一個(gè)Apple類型的元素,取出后轉(zhuǎn)型為RedApple必然會(huì)失斘袢取忆嗜;同樣的情況如果T是Apple,你add一個(gè)Fruit類型的元素崎岂,取出后轉(zhuǎn)型為Apple捆毫,也會(huì)拋出異常。也就是說冲甘,編譯器會(huì)把列表中取出的元素轉(zhuǎn)型為某種類型绩卤,但編譯器不確定這種轉(zhuǎn)型是不是會(huì)成功,即在不保證運(yùn)行時(shí)能順利進(jìn)行江醇,因此就不允許你add任何類型的元素濒憋。
再來看看List<? super Fruit> appList,這個(gè)列表的元素都是Fruit的父類T陶夜,也就是說當(dāng)你從這個(gè)列表中g(shù)et一個(gè)元素時(shí)凛驮,編譯器會(huì)自動(dòng)加一句轉(zhuǎn)型為T的代碼。好条辟,現(xiàn)在你往appList中add一個(gè)Apple類型的元素黔夭,取出時(shí)轉(zhuǎn)型為T,由于T是Apple的父類捂贿,向上轉(zhuǎn)型沒有問題纠修;加一個(gè)RedApple類型的元素,也一樣不會(huì)有問題厂僧。也就是說扣草,只要保證你往appList中添加的元素是Fruit的子類,編譯器就可以保證在轉(zhuǎn)型為T時(shí)不會(huì)拋出異常颜屠。因此第二種寫法可以過編譯辰妙。

還是用前面文章(http://www.reibang.com/p/5633ab144569)學(xué)生排序的例子。
學(xué)生類:

package Compara;

public class Student  {
    //定義學(xué)生類的名字name和分?jǐn)?shù)mark屬性
    public String name;
    public int mark;
    //定義構(gòu)造方法
    public Student(String name, int mark) {
        super();
        this.name = name;
        this.mark = mark;
    }
}

自定義的比較器StudentComparator:

package Compara;

import java.util.Comparator;

public class StudentComparator implements Comparator<Student> {
    
    @Override
    public int compare(Student o1, Student o2) {
        if (o1.name.compareTo(o2.name) > 0) {
            return 1;
        } else if (o1.name.compareTo(o2.name) == 0) {
            if (o1.mark - o2.mark > 0) {
                return 1;
            } else if (o1.mark - o2.mark == 0) {
                return 0;
            } else {
                return -1;
            }
        } else {
            return -1;
        }
    }

}

再自定義一個(gè)女學(xué)生類甫窟,繼承學(xué)生類:

package Compara;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class GirlStudent extends Student{
    public String name;
    public int mark;
    public String sex="women";

    public GirlStudent(String name, int mark) {
        super(name, mark);
        
    }

    public static void main(String[] args) {
        //new出來四個(gè)學(xué)生對(duì)象
        GirlStudent girlstu1=new GirlStudent("Limei",568);
        GirlStudent girlstu2=new GirlStudent("Chenxiaojuan",512);
        GirlStudent girlstu3=new GirlStudent("Limei",620);
        GirlStudent girlstu4=new GirlStudent("Zhouli",522);
        //new一個(gè)list密浑,將四個(gè)學(xué)生扔進(jìn)去。
        List<Student> girlstudentlist=new ArrayList<Student>();
        girlstudentlist.add(girlstu1);
        girlstudentlist.add(girlstu2);
        girlstudentlist.add(girlstu3);
        girlstudentlist.add(girlstu4);
        //條用Collections下的sort方法進(jìn)行排序粗井。
        Collections.sort(girlstudentlist,new StudentComparator());
        //打印出排序后的情況
        for(Student stu:girlstudentlist){
            System.out.println(stu.name+"=>"+stu.mark);
        }
    }
        

}

結(jié)果:

Chenxiaojuan=>512
Limei=>568
Limei=>620
Zhouli=>522

我們看源碼Collecctions中sort方法:

 public static <T> void sort(List<T> list, Comparator<? super T> c) {
        list.sort(c);
    }

Comparator<? super T> 表示是T的父類尔破?的比較器街图。這里的?在例子中指的是Student類,它是GirlStudent類的父類懒构。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末餐济,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子胆剧,更是在濱河造成了極大的恐慌絮姆,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秩霍,死亡現(xiàn)場(chǎng)離奇詭異篙悯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)铃绒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門鸽照,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匿垄,你說我怎么就攤上這事移宅。” “怎么了椿疗?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵漏峰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我届榄,道長(zhǎng)浅乔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任铝条,我火速辦了婚禮靖苇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘班缰。我一直安慰自己贤壁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布埠忘。 她就那樣靜靜地躺著脾拆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪莹妒。 梳的紋絲不亂的頭發(fā)上名船,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音旨怠,去河邊找鬼渠驼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鉴腻,可吹牛的內(nèi)容都是我干的迷扇。 我是一名探鬼主播百揭,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蜓席!你這毒婦竟也來了信峻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤瓮床,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后产镐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隘庄,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年癣亚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丑掺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡述雾,死狀恐怖街州,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玻孟,我是刑警寧澤唆缴,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站黍翎,受9級(jí)特大地震影響面徽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匣掸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一趟紊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碰酝,春花似錦霎匈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至碱璃,卻和暖如春弄痹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嵌器。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工肛真, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人爽航。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像沉删,于是被迫代替她去往敵國(guó)和親彤守。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 2.簡(jiǎn)單泛型 -********Java泛型的核心概念:告訴編譯器想使用什么類型, 然后編譯器幫你處理一切細(xì)節(jié) 2...
    CodingHou閱讀 388評(píng)論 0 0
  • 通配符 首先窄瘟,要展示數(shù)組的一種特殊行為,可以向?qū)С鲱愋偷臄?shù)組賦予基類型的數(shù)組引用趟卸。 main()的第一行創(chuàng)建了一個(gè)...
    呆呆李宇杰閱讀 389評(píng)論 0 0
  • java筆記 Main.java文件中的入口類(即包含main方法)的訪問權(quán)限不一定非要設(shè)定為public蹄葱,不加p...
    御風(fēng)逍遙閱讀 601評(píng)論 1 1
  • npm 安裝本地server 插件地址:https://www.npmjs.com/package/http-se...
    丶梵天閱讀 650評(píng)論 0 0
  • #白馬聲慢,我自手書#第一章 新生 周圍漆黑一片锄列,什么也沒有图云,什么也看不見。突然遠(yuǎn)處出現(xiàn)一個(gè)星點(diǎn)的亮光邻邮,這...
    zzx會(huì)計(jì)閱讀 292評(píng)論 0 0