泛型的使用

泛型的使用

Java在實(shí)際的使用過程中,會有類型轉(zhuǎn)換的問題,也就存在類型轉(zhuǎn)化異常的安全問題;所以Java提供了泛型來解決這個安全問題。

泛型類

把泛型定義在類型

格式

public class 類名<泛型類型1,...> {}

注意

泛型類型必須是引用類型

測試

public class TestClass {
    public static void main(String[] args) {
        // 創(chuàng)建類時指定什么類型查邢,屬性就是什么類型。
        // 把錯誤提前到編譯期顯示
        ObjectTest<String> o1 = new ObjectTest<>();
        o1.setT("張三");
        System.out.println(o1.getT());

        ObjectTest<Integer> o2 = new ObjectTest<>();
        o2.setT(15);
        System.out.println(o2.getT());
    }
}

// 泛型類
class ObjectTest<T> {
    private T t;

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }
}

泛型方法

把泛型定義在方法上

格式

public <泛型類型> 返回值類型 方法名(泛型類型1 args1,...) {}

測試

public class TestMethod {
    public static void main(String[] args) {
        // 泛型方法與類解綁
        MethodTest m = new MethodTest();
        
        System.out.println(m.show("張三"));
        System.out.println(m.show(13));
    }
}

class MethodTest {
    // 泛型方法
    public <T> T show(T t) {
        return t;
    }
}
public interface Validator {

    default <T> T parseJson(String param, Class<T> clz) {

        if (StringUtils.isEmpty(param)) {
            System.out.println("param is empty");
            return null;
        }

        T t = new Gson().fromJson(param, clz);

        if (Objects.isNull(t)) {
            System.out.println("parse param is null");
            return null;
        }

        return t;
    }
}

泛型接口

把泛型定義在接口上

格式

public interface <泛型類型1,...> {}

測試

  1. 實(shí)現(xiàn)類知道泛型的類型

    public class TestInter01<T> {
        public static void main(String[] args) {
            Inter inter = new InterImpl();
            inter.show("張三");
        }
    }
    
    interface Inter<T> {
        void show(T t);
    }
    
    class InterImpl implements Inter<String> {
        @Override
        public void show(String s) {
            System.out.println(s);
        }
    }
    
  1. 實(shí)現(xiàn)類不知道泛型的類型(常用)

    public class TestInter02 {
        public static void main(String[] args) {
            Inter<String> inter = new InterImpl<>();
            inter.show("張三");
        }
    }
    
    interface Inter<T> {
        void show(T t);
    }
    
    class InterImpl<T> implements Inter<T> {
        @Override
        public void show(T t) {
            System.out.println(t);
        }
    }
    

泛型通配符

class Animal {}
class Dog extends Animal {}
class Pig extends Animal {}
  • ?

    表示任意類型酵幕,如果類型明確扰藕,前后類型一致;如果沒有明確芳撒,就是Object以及任意子類

    // 類型明確
    public class TestTong {
        public static void main(String[] args) {
            Collection<Object> o1 = new ArrayList<Object>();
            // 錯誤
            // Collection<Object> o2 = new ArrayList<Animal>();
    
        }
    }
    
    // 類型不明確
    public class TestTong {
        public static void main(String[] args) {
            Collection<?> o1 = new ArrayList<Object>();
            Collection<?> o2 = new ArrayList<Animal>();
            Collection<?> o3 = new ArrayList<Dog>();
        }
    }
    
  • ? extends E

    向下限定邓深,E及其子類

    public class TestTong {
        public static void main(String[] args) {
            // 錯誤
            // Collection<? extends Animal> o1 = new ArrayList<Object>();
            Collection<? extends Animal> o2 = new ArrayList<Animal>();
            Collection<? extends Animal> o3 = new ArrayList<Dog>();
            Collection<? extends Animal> o4 = new ArrayList<Pig>();
        }
    }
    
  • ? super E

    向上限定,E及其父類

    public class TestTong {
        public static void main(String[] args) {
            Collection<? super Animal> o1 = new ArrayList<Object>();
            Collection<? super Animal> o2 = new ArrayList<Animal>();
            // 錯誤
            // Collection<? super Animal> o3 = new ArrayList<Dog>();
            // Collection<? super Animal> o4 = new ArrayList<Pig>();
        }
    }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末笔刹,一起剝皮案震驚了整個濱河市芥备,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舌菜,老刑警劉巖萌壳,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡袱瓮,警方通過查閱死者的電腦和手機(jī)缤骨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尺借,“玉大人绊起,你說我怎么就攤上這事×钦叮” “怎么了虱歪?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瘫里。 經(jīng)常有香客問我实蔽,道長,這世上最難降的妖魔是什么谨读? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮坛吁,結(jié)果婚禮上劳殖,老公的妹妹穿的比我還像新娘。我一直安慰自己拨脉,他們只是感情好哆姻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著玫膀,像睡著了一般矛缨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上帖旨,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天箕昭,我揣著相機(jī)與錄音,去河邊找鬼解阅。 笑死落竹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的货抄。 我是一名探鬼主播述召,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蟹地!你這毒婦竟也來了积暖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤怪与,失蹤者是張志新(化名)和其女友劉穎夺刑,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡性誉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年窿吩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片错览。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡纫雁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出倾哺,到底是詐尸還是另有隱情轧邪,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布羞海,位于F島的核電站忌愚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏却邓。R本人自食惡果不足惜硕糊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腊徙。 院中可真熱鬧简十,春花似錦、人聲如沸撬腾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽民傻。三九已至胰默,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漓踢,已是汗流浹背牵署。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彭雾,地道東北人碟刺。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像薯酝,于是被迫代替她去往敵國和親半沽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355