Java項(xiàng)目實(shí)戰(zhàn)開發(fā)Day14 2020-04-08

內(nèi)容

1.泛型簡(jiǎn)單介紹
2.類使用泛型
3.接口使用泛型
4.通配符
5.設(shè)置泛型上限和下限
6.泛型應(yīng)用之使集合自動(dòng)排序

一.泛型簡(jiǎn)單介紹

泛型這一塊在c++博客中寫過饱普,這里就不再引用虑瀑。因?yàn)榉盒驮诤笃诎沧块_發(fā)用的不多盆顾,所以只需掌握簡(jiǎn)單應(yīng)用即可酥筝。

1.用在哪

一般用于Collection和Map

2.何時(shí)用

在定義接口脱篙、類狰腌、方法和變量的時(shí)候僧鲁,需要操作數(shù)據(jù)虐呻,但是不清楚使用者需要哪種數(shù)據(jù)。這種情況下就需要使用泛型

3.注意點(diǎn)

①在定義的時(shí)候可以使用泛型來代表任意的類型寞秃,但是在使用的時(shí)候(定義變量斟叼、創(chuàng)建對(duì)象)必須要傳遞實(shí)際類型。
②泛型可以用E表示春寿,也可以用T表示朗涩。

二.類使用泛型

1.簡(jiǎn)單使用示例

class Test<E>{
    
}

主方法里面

        Test<String> test;
        new Test<String>();
  

當(dāng)創(chuàng)建對(duì)象的時(shí)候用了變量去保存對(duì)象了,這時(shí)候變量類型需要聲明具體類型绑改,但是new后面可以省略類型

    Test<String> test2 = new Test();

2.泛型變量的應(yīng)用示例

class Test<E>{
    E var1;
}

public class 測(cè)試程序   {                                                                                                             
           
    
    public static void main(String[] args)    {

        Test<String> test2 = new Test();
        test2.var1 = "jack";
        System.out.println(test2.var1.getClass());   
    }
}


結(jié)果

class java.lang.String

三.接口使用泛型

1.兩種使用方式

①明確用一個(gè)類實(shí)現(xiàn)接口谢床,進(jìn)而使用這個(gè)接口
②使用匿名內(nèi)部類使用這個(gè)接口

2.使用示例

//泛型接口
interface Test<T>{
    void test(T t);
}

//類繼承一個(gè)接口時(shí)兄一,
//1.指定接口的類型
class test1 implements Test<String>{

    @Override
    public void test(String t) {
        // TODO 自動(dòng)生成的方法存根
        
    }
    
}
//2.指定當(dāng)前類為泛型
class test2<T> implements Test<T>{

    @Override
    public void test(T t) {
        // TODO 自動(dòng)生成的方法存根
        
    }
    
}
public class 測(cè)試程序   {                                                                                                             
           
    
    public static void main(String[] args)    {
        //一.明確用一個(gè)類實(shí)現(xiàn)接口,進(jìn)而使用這個(gè)接口
        Test<String> test = new test2<String>();//test2后面的String可以省略
   
        //二.使用匿名內(nèi)部類使用這個(gè)接口
        Test<String> test3 = new Test<String>() {

            @Override
            public void test(String t) {
                // TODO 自動(dòng)生成的方法存根
                
            }
            
        };
    }
}


四.通配符

1.何時(shí)用

當(dāng)在使用泛型時(shí)识腿,如果不確定到底是什么類型出革,那么可以使用 來表示任意類型渡讼,這個(gè)骂束?就是泛型。
但是真真正正使用的時(shí)候成箫,還是要指定確定類型展箱,不能直接一個(gè)?

2.泛型方法

當(dāng)方法所在的類不是泛型類的時(shí)候蹬昌,必須在方法前面(訪問權(quán)限修飾符后)使用<T>或者<E>來表示需要使用泛型
如果類是泛型類混驰,就不需要在方法前面指定了

2.使用示例(包括泛型方法的使用)

import java.util.*;

//泛型方法
//當(dāng)類不是泛型類的時(shí)候,必須在方法前面使用<T>或者<E>來表示需要使用泛型
//如果類是泛型類皂贩,就不需要在方法前面指定了
class Foo{
    public<T> void test(T t) {
        System.out.println(t);
    }
    
    //這里也用到了泛型栖榨,List是泛型接口,這里可以直接用List先紫,相當(dāng)于沒有指定類型
    //這里也不能List<Object> ,因?yàn)镴ava的集合類型是不能自動(dòng)轉(zhuǎn)型的
    //也就是List<Child> 的東西自動(dòng)轉(zhuǎn)到 List<Father>是不可以的
    //即List<String>不能轉(zhuǎn)List<Object>
    //但是按照規(guī)定筹煮,又需要指定類型遮精,所以就可以使用一個(gè)?
    public void showList(List<?> list) {
        for(int i = 0;i < list.size();i++) {
            list.get(i);
            System.out.println(list.get(i));
        }
    }
}
public class 測(cè)試程序   {                                                                                                             
           
    
    public static void main(String[] args)    {
    
      Foo foo = new Foo();
      foo.test("jack");
      
      ArrayList<String> names = new ArrayList<>();
      names.add("merry");
      names.add("john");
      foo.test(names);
      
      foo.showList(names);
        
    }

}


結(jié)果

jack
[merry, john]
merry
john

3.注意點(diǎn)

Java的集合類型是不能自動(dòng)轉(zhuǎn)型的

五.設(shè)置泛型上限和下限

1.介紹

設(shè)置上限和下限其實(shí)涉及繼承败潦。就是雖然按照語法你可以隨意給我傳類型本冲,但是在實(shí)際情況中是有限制的。
比如小明要喝牛奶劫扒,你可以給他任意牛奶檬洞,比如蒙牛牛奶等等,但是最少你得是個(gè)牛奶沟饥,也就是你必須繼承(有可能直接繼承也有可能間接繼承)牛奶添怔,即上限是個(gè)牛奶。下限就是正常的牛奶牌子贤旷,比如各種正常品牌的牛奶广料,這都是可以的。但是下限幼驶、底線是這是能喝的艾杏,正常的健康的牛奶,不能瞎造一個(gè)就拿來喝盅藻,這是下限购桑。

2.上限設(shè)置使用示例

import java.util.*;

class Cat{
    
}
//設(shè)置泛型的上限 extends
interface IFood{
    
}
class Milk implements IFood{
    
}
class TianyouMilk extends Milk{
    
}
//上限是IFood畅铭,可以傳過來IFood,也可以是Milk勃蜘,也可以是TianyouMilk
class Student<T extends IFood>{//表示指定傳遞過來的類型的父類必須是IFood硕噩,或者其子類。
    public void eat(T t) {
        
    }
}
public class 測(cè)試程序   {                                                                                                             
           
    
    public static void main(String[] args)    {
    
        Student<Milk> xw ;
        Student<TianyouMilk> zs;
        
        //Student<Object> zt;//這樣就不行了
        //Student<Cat> ca;//這樣依然不行
        
    }

}


3.下限設(shè)置使用示例

//使用super來設(shè)置下限
class STest{
    public<T> void copy(List<T> src,List<? super T> dest) {
        //最少也得是T類型才能copy給我
    }
}

六.泛型應(yīng)用之使集合自動(dòng)排序

1.功能介紹

之前的集合排序都是:先把數(shù)據(jù)傳進(jìn)去元旬,然后調(diào)用排序方法榴徐。那么可不可以改進(jìn)一下,使數(shù)據(jù)傳進(jìn)去就自動(dòng)排序了呢匀归?
答案是肯定的坑资,具體過程請(qǐng)看使用示例。

2.具體代碼

類① Person類

注意點(diǎn)
(1)實(shí)現(xiàn)Comparable接口
(2)重寫compareTo方法穆端,注意返回的值是如何表示的袱贮。

public class Person implements Comparable<Person>{

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

    @Override
    public int compareTo(Person arg0) {
        // TODO 自動(dòng)生成的方法存根
        return name.compareTo(arg0.name);
    }
}
類②SortList類

注意點(diǎn)
(1)這個(gè)類是自己創(chuàng)建的,繼承ArrayList体啰,所以有ArrayList的方法攒巍。
(2)因?yàn)橐獙?shí)現(xiàn)特定功能,所以要重寫add方法荒勇。
(3)注意第一個(gè)extends柒莉,這個(gè)表示這個(gè)泛型的上限必須是Comparable,對(duì)應(yīng)的Person類實(shí)現(xiàn)了Comparable接口
(4)沽翔? 后面的super表示兢孝?的下限是 T類型,因?yàn)槭荰要進(jìn)行比較仅偎,不能亂給我別的類型

import java.util.*;

//這個(gè)類的功能:
//在系統(tǒng)原有的基礎(chǔ)之上添加一個(gè)功能:一將數(shù)據(jù)加入數(shù)組跨蟹,就排好序
public class SortedList<T extends Comparable<? super T>> extends ArrayList<T>{

    //添加數(shù)據(jù)就排好序
    //1.先調(diào)用系統(tǒng)的方法
    //2.把系統(tǒng)的add方法進(jìn)行重寫
/** public boolean add(T t) {
        return super.add(t);
    }**/
    public boolean add(T t) {
        //將數(shù)據(jù)排序
        boolean result = super.add(t);
        
        //對(duì)數(shù)組排序
        Collections.sort(this);
        
        //返回結(jié)果
        return result;
    }
}
類③主方法所在類

注意點(diǎn):這里直接使用自己寫的類創(chuàng)建集合即可。

import java.util.*;

public class 測(cè)試程序   {                                                                                                             
           
    
    public static void main(String[] args)    {    

        SortedList<Person> lists = new SortedList<Person>();
        
        lists.add(new Person("jack"));
        lists.add(new Person("black"));
        lists.add(new Person("merry"));
        
        System.out.println(lists);
        
    }

}

結(jié)果

[black, jack, merry]

總結(jié)

前幾天以為沒有課程橘沥,就沒聽課窗轩,到昨天才發(fā)現(xiàn)課程一直在更新,所以就有點(diǎn)尷尬座咆。但是還是不要慌痢艺,落下的部分慢慢去學(xué),這一遍一定要學(xué)透徹〗樘眨現(xiàn)在有兩個(gè)demo腹备,一個(gè)是撲克牌的,一個(gè)是聯(lián)系人的斤蔓,雖然寫完了植酥,但是還沒有著手研究。我一定會(huì)抽時(shí)間寫出來的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末友驮,一起剝皮案震驚了整個(gè)濱河市漂羊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卸留,老刑警劉巖走越,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異耻瑟,居然都是意外死亡旨指,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門喳整,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谆构,“玉大人,你說我怎么就攤上這事框都“崴兀” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵魏保,是天一觀的道長(zhǎng)熬尺。 經(jīng)常有香客問我,道長(zhǎng)谓罗,這世上最難降的妖魔是什么粱哼? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮檩咱,結(jié)果婚禮上揭措,老公的妹妹穿的比我還像新娘。我一直安慰自己税手,他們只是感情好蜂筹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布需纳。 她就那樣靜靜地躺著芦倒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪不翩。 梳的紋絲不亂的頭發(fā)上兵扬,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音口蝠,去河邊找鬼器钟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛妙蔗,可吹牛的內(nèi)容都是我干的傲霸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼昙啄!你這毒婦竟也來了穆役?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤梳凛,失蹤者是張志新(化名)和其女友劉穎耿币,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體韧拒,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淹接,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叛溢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塑悼。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖雇初,靈堂內(nèi)的尸體忽然破棺而出拢肆,到底是詐尸還是另有隱情,我是刑警寧澤靖诗,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布郭怪,位于F島的核電站,受9級(jí)特大地震影響刊橘,放射性物質(zhì)發(fā)生泄漏鄙才。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一促绵、第九天 我趴在偏房一處隱蔽的房頂上張望攒庵。 院中可真熱鬧,春花似錦败晴、人聲如沸浓冒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稳懒。三九已至,卻和暖如春慢味,著一層夾襖步出監(jiān)牢的瞬間场梆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工纯路, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留或油,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓驰唬,卻偏偏與公主長(zhǎng)得像顶岸,于是被迫代替她去往敵國(guó)和親腔彰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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

  • 一辖佣、概述 1.1 什么是Java泛型 Java 泛型(generics)是 JDK 5 中引入的一個(gè)新特性, 泛型...
    AaronSimon閱讀 301評(píng)論 0 8
  • 泛型: 本內(nèi)容均屬原創(chuàng)凌简,一個(gè)字一個(gè)字敲的上炎,如果要轉(zhuǎn)載請(qǐng)注明出處:http://www.reibang.com/p...
    坑王老薛閱讀 1,400評(píng)論 0 9
  • 與Java泛型相同,Kotlin同樣提供了泛型支持雏搂。對(duì)于簡(jiǎn)單的泛型類藕施、泛型函數(shù)的定義,Kotlin 與 Java ...
    凌寒天下獨(dú)自舞閱讀 266評(píng)論 0 0
  • 獨(dú)自吟唱君山行凸郑, 道于花兒它可明裳食? 何需天涯覓知音? 天地萬物潤(rùn)我心芙沥。
    灰叔漫畫閱讀 280評(píng)論 5 7
  • 聊天的時(shí)候會(huì)笑 分別的時(shí)候會(huì)酸 獨(dú)處的時(shí)候會(huì)想 見你和別人親近的時(shí)候會(huì)惱 在獨(dú)處 在想
    逆風(fēng)有楊閱讀 300評(píng)論 2 3