泛型--泛型萬用字元和泛型的上下限

??魯阿豔??發表於2020-12-02

泛型

泛型概述

  泛型:可以在類或者方法當中預支的使用未知的資料型別。

備註:一般在建立物件的時候,將未知的資料型別確定為具體的資料型別,當沒有指定泛型時,預設型別為Object型別。

使用泛型的好處

  避免了型別轉換的麻煩,儲存的是什麼樣的資料型別,取出的就是什麼樣的資料型別

  把執行期異常(程式碼執行之後會丟擲異常)提升到編譯期階段(寫程式碼的時候就會報錯。)

備註:泛型它其實也是資料型別的一部分,一般我們將類名泛型合併一起看做資料型別。

泛型的定義與使用

  泛型,用來靈活的將資料型別應用到不同的類、方法、介面當中。將資料型別作為引數進行傳遞。

因為我們的集合框架體系中,大量的使用了泛型

定義和使用含有泛型的類

定義格式:

修飾符 class 類名<代表泛型的變數>{
    
}

例如:

public class ArrayList<E>{
    public boolean add(E e){}
    public E get(int index){}
    //....
}

備註:定義的時候使用未知的泛型的變數,使用的時候(建立物件)確定的泛型的具體型別。

定義並使用含有泛型的方法

定義格式:

修飾符 <代表泛型的變數> 返回值型別 方法名(泛型引數){}

例如:

public class GenericMethod {
    // 定義帶有泛型的方法
    public <VIP> void show (VIP vip) {
        System.out.println(vip);
    }
    // 定義一個含有泛型的返回值
    public <VIP> VIP show02(VIP vip) {
        //.....
        return vip;
    } 
}
// 定義測試類
public class TestGenericMethod {
    public static void main(String[] args){
        // 建立物件
        GenericMethod gm = new GenericMethod();
        // 呼叫帶有泛型的方法
        gm.show("abc");// VIP vip 引數 ---》形參   String str  str="abc"
        gm.show(123);// VIP--->Integer  vip = 123
        gm.show2(3.14);// VIP --->Double vip=3.14
    }
}

定義並使用含有泛型的介面

定義格式:

修飾符  interface  介面名<代表泛型的變數> {}

例如:

public interface Collection<E> {
    public void add(E e);
    public Iterator<E> iterator();
}
// 自定義一個泛型的介面
public interface MyGenericInterface<T> {
    public abstract void add(E e);
    public abstract E get();
    //....
}

使用格式:

  1. 定義實現類時可以確定泛型的型別

    public class MyInterfaceImpl implements MyGenericInterface<String> {
        @Override
        public void add(String e) {
            //....
        }
        @Override
        public String get(){
            // ....
        }
    }
    

    備註:此時泛型【T的值】就是String型別

  2. 始終不確定泛型的型別,直到建立物件的時候,確定泛型的型別

例如:

public class MyInterfaceImpl02<T> implements MyGenericInterface<T> {
    @Override
    public void add(T t) {
        //....
    }
    @Override
    public T get(){
        //......
    }
}

確定泛型

/*
    使用泛型
 */
public class Demo04Generic {
    public static void main(String[] args) {
       MyInterface<String>  my =  new MyInterfaceImpl<String>();
        my.add("abc");
        
    } 
}

泛型萬用字元 (?)

  當使用泛型類或者泛型介面,傳遞的資料中,泛型的型別不確定,可以通過萬用字元<?>表示。一旦程式當中使用泛型的萬用字元後,只能使用Object類中的共性的方法,集合中元素自身方法無法使用。

萬用字元的基本使用

​  泛型的萬用字元:不知道使用什麼型別來接收的時候,此時可以使用?,?代表未知的萬用字元。

  此時只能接收資料,不能往該集合當中儲存資料。

程式碼示例:

public static void main(String[] args) {
    // 可以儲存整數的集合
    Collection<Integer> list01 = new ArrayList<Integer>();
    // 此時list01可以儲存整數的資料
    // 展示list01集合當中的資料
    getElement(list01);
    // 可以儲存String字串的集合
    Collection<String> list02 = new ArrayList<String>();
    // 此時list02可以儲存字串的資料
    getElement(list02)//   Collection<Object>  ×  不可以
    // 此時如果換成泛型萬用字元? 就可以接收
    getElement(list02);// 可以        
}
// 可以接收任意的資料型別
public static void getElement(Collection<?> coll){
    // 只能接收Integer型別的資料
    // 此時? 可以代表任意型別
}

備註:泛型不存在繼承關係 Collection

相關文章