最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入淺出理解Java泛型的使用

 更新時間:2021年09月13日 14:34:32   作者:威斯布魯克.猩猩  
這篇文章主要介紹了深入淺出理解Java泛型的使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、泛型的意義

二、泛型的使用

1.jdk 5.0新增特性
2.在集合中使用泛型:
總結:
A.集合接口或集合類在jdk5.0時都修改為帶泛型的結構。
B.在實例化集合類時,可以指明具體的泛型類型。
C.指明完以后,在集合類或接口中凡是定義類或接口時,內部結構(比如:方法、構造器、屬性等)使用類的泛型的位置,
都指定為實例化的泛型類型。比如:add(E e) --->實例化以后:add(Integer e)
D.注意點:泛型的類型必須是類,不能是基本數據類型。需要用到基本數據類型的位置,用包裝類去替換
E.如果實例化時,沒有指明泛型的類型。默認類型為java.lang.Object類型。
3.如何自定義泛型結構:泛型類、泛型結構、泛型方法

 //在集合中使用泛型之前的情況:
    @Test
    public void test1(){
        ArrayList list = new ArrayList();
        //需求:存放學生的成績
        list.add(78);
        list.add(76);
        list.add(89);
        list.add(88);
        //問題一:類型不安全
        list.add("Tom");
        for(Object score : list){
            //問題二:強轉時,可能出現ClassCateException
            int stuScore = (Integer)score;
            System.out.println(stuScore);
        }
    }
    //在集合中使用泛型的情況:
    @Test
    public void test2(){
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(78);
        list.add(76);
        list.add(89);
        list.add(88);
        //編譯時,就會進行類型檢查,保證數據的安全
//        list.add("Tom");
        //方式一:
        for(Integer score : list){
            //避免了強轉操作
            int stuScore = score;
            System.out.println(stuScore);
        }
        //方式二:
        Iterator<Integer> iterator = list.iterator();
        while(iterator.hasNext()){
            int stuScore = iterator.next();
            System.out.println(stuScore);
        }
    }
    //在集合中使用泛型的情況:以HashMap為例
    @Test
    public void test3(){
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("Tom",87);
        map.put("Jerry",87);
        map.put("Jack",67);
        //泛型的嵌套
        Set<Map.Entry<String, Integer>> entry = map.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator = entry.iterator();
        while(iterator.hasNext()){
            Map.Entry<String, Integer> entry1 = iterator.next();
            String key = entry1.getKey();
            Integer value = entry1.getValue();
            System.out.println(key + "----" + value);
        }
    }

三、自定義泛型類

1.泛型類可能有多個參數,此時應將多個參數一起放在尖括號內。比如:
<E1,E2,E3>

2.泛型類的構造器如下: public GenericClass (){}。
而下面是錯誤的: public GenericClass < E >(){}

3.實例化后,操作原來泛型付置的結構必須與指定的泛型類型致。

4.泛型不同的引用不能相互賦值。
盡管在編譯時 ArrayList < String >和 ArrayListslnteger 是兩種類型,但是,在運行時只有一個 ArrayList 被加載到 JVM 中。

5.泛型如果不指定,將被探除,泛型對應的類型昀按照 Object 處理,但不等價于Object 。經驗:泛型要使用路都用。要不用,一路都本要用。

6.如果泛型類是一個按口或抽象類,則不可創(chuàng)建泛型類的對象。

7.jdk1.7 ,泛的簡化操作 ArrayList < Fruit > flist = new ArrayList<>();

8.泛型的指定中不能使用基本數據類型,可以使用包裝類替換。

 

1.關于自定義泛型類、泛型接口:

@Test
    public void test1(){
        //如果定義了泛型類,實例化沒有指明類的泛型,則認為此泛型類型為Object類型
        //要求:如果大家定義了類是帶泛型的,建議在實例化時要指明類的泛型。
        Order order = new Order();
        order.setOrderT(123);
        order.setOrderT("ABC");
        //建議:實例化時指明類的泛型
        Order<String> order1 = new Order<String>("OrderAA", 1001, "Order:AA");
        order1.setOrderT("AA:hello");
    }
    @Test
    public void test2(){
        SubOrder sub1 = new SubOrder();
        //由于子類在繼承帶泛型的父類時,指明了泛型類型。則實例化子類對象時,不再需要指明泛型。
        sub1.setOrderT(1122);
        SubOrder1<String> sub2 = new SubOrder1<>();
        sub2.setOrderT("order2...");
    }
    //測試泛型方法
    @Test
    public void test3(){
        Order<String> order = new Order<>();
        Integer[] arr = new Integer[]{1, 2, 3, 4};
        //泛型方法在調用時,指明泛型參數的類型
        List<Integer> list = order.copyFromArrayToList(arr);
        System.out.println(list);//[1, 2, 3, 4]
    }
自定義泛型類
public class Order<T> {
    String orderName;
    int orderId;
    //類的內部結構就可以使用類的泛型
    T orderT;
    public Order(){};
    public Order(String orderName,int orderId,T orderT){
        this.orderName = orderName;
        this.orderId = orderId;
        this.orderT = orderT;
    }
    public T getOrderT(){
        return orderT;
    }
    @Override
    public String toString() {
        return "Order{" +
                "orderName='" + orderName + '\'' +
                ", orderId=" + orderId +
                ", orderT=" + orderT +
                '}';
    }
    public void setOrderT(T orderT){
        this.orderT = orderT;
    }
    //泛型方法:在方法中出現了泛型的結構,翻新參數與類的泛型參數沒有任何關系。
    //換句話說,泛型方法所屬的類是不是泛型類都沒有關系。
    //泛型方法,可以聲明為靜態(tài)的,原因:泛型參數是在調用方法時確定的,并非在實例化時確定。
    public <E> List<E> copyFromArrayToList(E[] arr){
        ArrayList<E> list = new ArrayList<>();
        for(E e : arr){
            list.add(e);
        }
        return list;
    }
}

2.泛型在繼承方面的體現

 
   1.泛型在繼承方面的體現
     雖然類A是類B的父類,但是G<A>,和<B>二者不具備子父類關系,二者是并列關系。
       補充:類A是類B的父類,A<G>是B<G>的父類
    public void test1(){
        Object obj = null;
        String str = null;
        obj = str;//子類對象賦值給父類;多態(tài)的體現
 
        Object[] arr1 = null;
        String[] arr2 = null;
        arr1 = arr2;//子類對象賦值給父類;多態(tài)的體現
 
        //編譯不通過
//        Date date = new Date();
//        str = date;
        List<Object> list1 = null;
        List<String> list2 = null;
        //此時的list1和list2的類型不具有子父類的關系
        //編譯不通過
//        list1 = list2;
    }
    @Test
    public void test2(){
        AbstractList<String> list1 = null;
        List<String> list2 = null;
        ArrayList<String> list3 = null;
        list1 = list3;
        list2 = list3;
        List<String> list4 = new ArrayList<>();
    }

3.通配符的使用

@<?>
允許所有泛型的引用調用

@通配符指定上限
上限 extends :使用時指定的類型必須是繼承某個類,或者實現某個接口,即<=

@通配符指定下限
下限 super :使用時指定的類型不能小于操作的類,即>=

@舉例:
><? extends Number >(無窮小, Number ]
只允許泛型為 Number 及 Number 子類的引用調用
><? super Number > INumber ,無窮大)
只允許泛型為 Number 及 Number 父類的引用調用
><? extends Comparable >
只允許泛型為實現 ComDarable 接口的實現類的引用調用

/*
    2.通配符的使用
      通配符:?
      類A是類B的父類,G<A>和G<B>是沒有關系的,二者共同的父類是:G<?>
     */
    @Test
    public void test3(){
        List<Object> list1 = null;
        List<String> list2 = null;
        List<?> list = null;
        list = list1;
        list = list2;
        //編譯通過
//        print(list1);
//        print(list2);
 
        ArrayList<String> list3 = new ArrayList<>();
        list3.add("AA");
        list3.add("BB");
        list3.add("CC");
        list = list3;
        //添加(寫入):對于List<?>就不能向其內部添加數據。
        //除了添加null之外。
//        list.add("dd");
//        list.add('d');
        list.add(null);
        //獲取(讀取):允許讀取數據,讀取的數據類型為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);
        }
    }
    /*
    3.有限制條件的通配符的使用。
       ? extends A:
                G<? extends A> 可以作為G<A>和G<B>的父類,其中B是A的子類
       ? super A:
                G<? super A> 可以作為G<A>和G<B>的父類,其中B是A的父類
     */
    @Test
    public void test4(){
        List<? extends Person> list1 = null;//extends可理解為:小于等于
        List<? super Person> list2 = null;//super可以理解為:大于等于
 
        List<Student> list3 = new ArrayList<Student>();
        List<Person> list4 = new ArrayList<Person>();
        List<Object> list5 = new ArrayList<Object>();
 
        list1 = list3;
        list1 = list4;
//        list1 = list5;//編譯報錯
 
//        list2 = list3;//編譯報錯
        list2 = list4;
        list2 = list5;
        //讀取數據:
        list1 = list3;
        Person p = list1.get(0);
        //編譯不通過:
//        Student s = list1.get(0);
        list2 = list4;
        Object obj = list2.get(0);
        //編譯不通過
//        Person obj = list2.get(0);
        //寫入數據:
        //編譯不通過
//        list1.add(new Student());
        //編譯通過
        list2.add(new Person());
        list2.add(new Student());
 
    }

到此這篇關于深入淺出理解Java泛型的使用的文章就介紹到這了,更多相關Java泛型內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • spring boot + jpa + kotlin入門實例詳解

    spring boot + jpa + kotlin入門實例詳解

    這篇文章主要介紹了spring boot + jpa + kotlin入門實例詳解 ,需要的朋友可以參考下
    2017-07-07
  • Java動態(tài)代理機制詳解_動力節(jié)點Java學院整理

    Java動態(tài)代理機制詳解_動力節(jié)點Java學院整理

    這篇文章主要為大家詳細介紹了Java動態(tài)代理機制,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • SpringBoot整合RabbitMQ的5種模式實戰(zhàn)

    SpringBoot整合RabbitMQ的5種模式實戰(zhàn)

    本文主要介紹了SpringBoot整合RabbitMQ的5種模式實戰(zhàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Mybatis聯合查詢的實現方法

    Mybatis聯合查詢的實現方法

    本文主要介紹了 Mybatis聯合查詢的實現方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 簡述Java中throw-throws異常拋出

    簡述Java中throw-throws異常拋出

    任何Java代碼都可以拋出異常,本文主要介紹了Java中throw-throws異常拋出,具有一定的參考價值,感興趣的可以了解一下
    2021-08-08
  • 詳解Java如何應對常見的安全威脅和攻擊類型

    詳解Java如何應對常見的安全威脅和攻擊類型

    隨著信息技術的快速發(fā)展,網絡安全問題日益突出,本文將以Java開發(fā)語言為例,深入探討網絡協(xié)議的安全性問題,通過分析常見的安全威脅和攻擊類型,設計和實施安全協(xié)議等主題,為讀者提供一些有益的思路和方法,需要的朋友可以參考下
    2023-11-11
  • java實現文件導入導出

    java實現文件導入導出

    這篇文章主要介紹了java實現文件導入導出的方法和具體示例代碼,非常的簡單實用,有需要的小伙伴可以參考下
    2016-04-04
  • 23種設計模式(10)java組合模式

    23種設計模式(10)java組合模式

    這篇文章主要為大家詳細介紹了23種設計模式之java組合模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Java中使用ConcurrentHashMap實現線程安全的Map

    Java中使用ConcurrentHashMap實現線程安全的Map

    在Java中,ConcurrentHashMap是一種線程安全的哈希表,可用于實現多線程環(huán)境下的Map操作。它支持高并發(fā)的讀寫操作,通過分段鎖的方式實現線程安全,同時提供了一些高級功能,比如迭代器弱一致性和批量操作等。ConcurrentHashMap在高并發(fā)場景中具有重要的應用價值
    2023-04-04
  • 解決java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver報錯問題

    解決java.lang.ClassNotFoundException: com.mysql.cj.jdbc.D

    這篇文章主要介紹了解決java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver報錯問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評論

砀山县| 岚皋县| 浏阳市| 吉木萨尔县| 岢岚县| 原阳县| 信宜市| 珠海市| 永兴县| 余江县| 东至县| 鄂托克前旗| 厦门市| 漯河市| 林西县| 德令哈市| 昌吉市| 自贡市| 喀什市| 淮阳县| 绥化市| 大同县| 南丹县| 芜湖市| 甘泉县| 两当县| 博兴县| 北京市| 周口市| 峨边| 古丈县| 抚顺市| 理塘县| 交城县| 金堂县| 阳城县| 确山县| 长武县| 壶关县| 凤台县| 神农架林区|