泛型(jdk5.0新特性)

在集合中使用泛型

1、集合接口或集合類在jdk5.0時都修改為帶泛型的結(jié)構(gòu)
2、在實例化集合類時盆繁,可以指明具體的泛型類型
3、在集合類或接口中凡是定義類或接口時旬蟋,內(nèi)部結(jié)構(gòu)使用到類的泛型的位置油昂,都指定為實例化的泛型類型。
4倾贰、泛型的類型必須是類秕狰,不能是基本數(shù)據(jù)類型,基本數(shù)據(jù)類型需要用到其對應(yīng)的包裝類
5躁染、如果實例化時鸣哀,沒有指明泛型的類型,默認(rèn)類型為java.lang.Object

  • 注意:
    1吞彤、泛型不同的引用不能相互賦值
    2我衬、靜態(tài)方法中不能使用類的泛型
    3叹放、異常類不能聲明為泛型類
//1、泛型不同的引用不能相互賦值
ArrayList<String> list1 = new ArrayList<String>();
ArrayList<Integer> list2 = new ArrayList<Integer>();
list1 = list2;//這樣賦值是錯誤的

//2挠羔、靜態(tài)方法中不能使用類的泛型
public static void show(T orderT){
   System.out.println(orderT);

//編譯不通過
T[] arr = new T[10];
//編譯通過
T[] arr = (T[])new Object[10]
}

package java1;

import org.junit.Test;

import java.util.*;

public class GenericTest {
    //在集合中使用泛型,以ArrayList為例
    @Test
    public void test1(){
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(100);
        list.add(90);
        list.add(80);
        list.add(70);
        list.add(60);

    //  list.add("Tom");//java: 不兼容的類型: java.lang.String無法轉(zhuǎn)換為java.lang.Integer
        for(Integer score : list){
            System.out.println(score);
        }

        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

    //泛型的使用井仰,以HashMap為例
    @Test
    public void test2(){
        HashMap<String, Integer> info = new HashMap<>();
        info.put("fhz",21);
        info.put("fyz",20);
        info.put("cym",21);

        Set<Map.Entry<String,Integer>> entry = info.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator = entry.iterator();
        while (iterator.hasNext()){
            Map.Entry e = iterator.next();
            Object key = e.getKey();
            Object value = e.getValue();
            System.out.println(key + "-" + value);//"fyz-20","cym-21","fhz-21"
        }
    }
}

自定義泛型結(jié)構(gòu)

  • 自定義泛型類
package java1;

import org.junit.Test;

public class GenericTest1 {
    @Test
    public void test(){
        Order order = new Order();
        //如果定義了泛型類,實例化沒有指明泛型的類型破加,則認(rèn)為此泛型類型為Object類型
        //如果定義的時候有泛型俱恶,建議實例化的時候指明泛型類型
        order.setOrderT(123);
        order.setOrderT("A");

        Order<String> order1 = new Order<String>();
        order1.setOrderT("A");
        System.out.println(order1.getOrdetT());//"A"

        //由于子類在繼承帶泛型的父類時,指明了泛型類型范舀,則實例化子類對象時合是,不再需要指明泛型
        SubOrder subOrder = new SubOrder();
        subOrder.setOrderT(123);

        SubOrder1<Integer> subOrder1 = new SubOrder1<Integer>();
        subOrder1.setOrderT(123);
    }
}

package java1;

public class Order<T> {
    String orderName;
    int orderId;
    T orderT;

    public Order(){};

    public Order(String orderName,int orderId){
        this.orderId = orderId;
        this.orderName = orderName;
    }

    public T getOrdetT(){
        return orderT;
    }

    public void setOrderT(T orderT){
        this.orderT = orderT;
    }

}
public class SubOrder extends Order<Integer>{//SubOrder是普通類
}
public class SubOrder1<T> extends Order<T>{//SubOrder1<T>仍然是泛型類
}
  • 自定義泛型方法
    泛型方法:在方法中出現(xiàn)了泛型的結(jié)構(gòu),泛型參數(shù)與類的泛型參數(shù)沒有任何關(guān)系锭环,換句話說:泛型方法所屬的類是不是泛型類無所謂

泛型方法可以聲明為靜態(tài)的聪全,原因:泛型參數(shù)是在調(diào)用方法時確定的,并非在實例化時確定辅辩。

以下兩個不是泛型方法
public T getOrdetT()
public void setOrderT(T orderT)

//泛型方法
 public <E> List<E> copyFromArrayToList(E[] arr ){
        ArrayList<E> list = new ArrayList<>();
        for(E e : arr){
            list.add(e);
        }
        return list;
    }

 //泛型方法在調(diào)用時难礼,指明泛型參數(shù)的類型
        Integer[] arr = new Integer[]{1,2,3,4};
        List<Integer> list1 = order1.copyFromArrayToList(arr);
        System.out.println(list1);//[1, 2, 3, 4]

泛型類和泛型方法的使用情境

泛型在繼承性上的體現(xiàn)

  1. 雖然類A是類B的父類,但是G<A>和G<B>不具備子父類關(guān)系玫锋,二者是并列關(guān)系蛾茉。
  2. 類A是類B的父類,則A<G>是B<G>的父類
  3. 使用通配符<?>后對于List<?>不能向其內(nèi)部添加數(shù)據(jù)撩鹿,除了null臀稚。允許讀取數(shù)據(jù),讀取的數(shù)據(jù)類型為Object
 public void test4(){
        List<Object> list1 = null;
        List<String> list2 = null;
        
        //通配符:list相當(dāng)于list1和list2的父類
        List<?> list = null;
        list = list1;
        list = list2;

        List<String> list3 = new ArrayList<>();
        list3.add("A");
        list3.add("B");
        list3.add("C");

        list = list3;
        //添加:對于List<?>不能向其內(nèi)部添加數(shù)據(jù)三痰,除了null
        //list.add("D");
        list.add(null);

        //讀取:允許讀取數(shù)據(jù)窜管,讀取的數(shù)據(jù)類型為Object
        Object o = list.get(0);
        System.out.println(o);
    }

    public void print(List<?> list){
        Iterator<?> iterator = list.iterator();
        while (iterator.hasNext()){
            Object obj = iterator.next();
            System.out.println(obj);
        }
    }
  • 有限制條件的通配符的使用:
    ? extends A:
    G<? extends A>可以作為G<A>和G<B>的父類散劫,其中B是A的子類
    ? super A
    G<? super A>可以作為G<A>和G<B>的父類,其中B是A的父類
    讀數(shù)據(jù):跟上面類似
    寫數(shù)據(jù):可以
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末幕帆,一起剝皮案震驚了整個濱河市获搏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌失乾,老刑警劉巖常熙,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異碱茁,居然都是意外死亡裸卫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門纽竣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來墓贿,“玉大人茧泪,你說我怎么就攤上這事×” “怎么了队伟?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長幽勒。 經(jīng)常有香客問我嗜侮,道長,這世上最難降的妖魔是什么啥容? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任锈颗,我火速辦了婚禮,結(jié)果婚禮上干毅,老公的妹妹穿的比我還像新娘宜猜。我一直安慰自己,他們只是感情好硝逢,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布姨拥。 她就那樣靜靜地躺著,像睡著了一般渠鸽。 火紅的嫁衣襯著肌膚如雪叫乌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天徽缚,我揣著相機與錄音憨奸,去河邊找鬼。 笑死凿试,一個胖子當(dāng)著我的面吹牛排宰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播那婉,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼板甘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了详炬?” 一聲冷哼從身側(cè)響起盐类,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呛谜,沒想到半個月后在跳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡隐岛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年猫妙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聚凹。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡吐咳,死狀恐怖逻悠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情韭脊,我是刑警寧澤童谒,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站沪羔,受9級特大地震影響饥伊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蔫饰,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一琅豆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧篓吁,春花似錦茫因、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盛嘿,卻和暖如春洛巢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背次兆。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工稿茉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芥炭。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓漓库,卻偏偏與公主長得像,于是被迫代替她去往敵國和親园蝠。 傳聞我的和親對象是個殘疾皇子渺蒿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

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