泛型概念與用例

什麼是泛型

  泛型的本質是參數化類型,也就是說所操作的 數據類型 被指定爲一個參數

泛型有什麼優勢

  泛型完成的功能,Object類型也能完成,但是使用泛型可以更加方便,如泛型不需要類型轉換、泛型在編譯期間就能發現類型異常等

類型通配符

  1. 使用?代替具體的類型參數
  2. 通過super或extends來限定通配符範圍

List<? extends T>和List <? super T>之間有什麼區別 ?

  考察的是 限定通配符非限定通配符 的問題;
  其兩者都是限定通配符,List<? extends T> 可以接受任何繼承自T類型的元素,而 List<? super T> 可以接受任何T的父類元素。例如List<? extends Number>可以接受List或List;
  非限定通配符用 < ? > 表示,可以用任意類型來替代。

泛型類、泛型接口、泛型方法簡單用例

泛型類

/**
 * @Author Snail
 * @Describe 泛型的測試用例
 * @CreateTime 2019/11/28
 */
public class GenericTest<T> {
    private T t;

    public GenericTest(T t) {
        this.t = t;
    }

    public void showType() {
        System.out.println("T的實際類型是:" + t.getClass().getName());
    }

    public static void main(String[] args) {
        GenericTest<Integer> gen = new GenericTest(1);
        gen.showType();//T的實際類型是:java.lang.Integer
        System.out.println(" ====================== ");

        //定義泛型類Generic的一個String的版本
        GenericTest<String> strObj = new GenericTest("Hello Gen!");
        strObj.showType();//T的實際類型是:java.lang.String
    }
}

  在上面的例子中,沒有限制 T 的範圍,T 可以是任意的類型。
  如果需要限制 T 類型,其 T 符合單繼承多實現(繼承的類在前,實現的接口在後)的規則,寫法如下:

public class GenericTest<T extends Number & Serializable > {
//表達的意思:限制 T 必須是類 Number 和接口 Serializable 的共同子類
...
}

泛型接口

/**
 * @Author Snail
 * @Describe 泛型接口測試
 * @CreateTime 2019/11/29
 */
public class GenericInterfaceTest implements GenericInterface<String>{

    @Override
    public String get() {
        return "string";
    }

    public static void main(String[] args) {
        GenericInterfaceTest genericInterfaceTest = new GenericInterfaceTest();
        System.out.println(genericInterfaceTest.get());
    }
}
interface GenericInterface<T>{
    public T get();
}

泛型方法

泛型方法在調用時可以接收不同類型的參數,在方法內部可以根據不同的類型做出不同的處理。

/**
 * @Author Snail
 * @Describe 泛型方法測試用例
 * @CreateTime 2019/11/29
 */
public class GenericMethodTest {
    //泛型方法
    //1.所有泛型方法聲明都有一個類型參數聲明部分(由尖括號分隔),該類型參數聲明部分在方法返回類型之前(在下面例子中的<E>)。
    static <E> void print(E[] arr){
        for(E e:arr){
            System.out.println(e);
        }
        System.out.println();
    }

    public static void main(String[] args) {
        print(new Integer[]{1,2,33,44});
        print(new String[]{"a","bb","ccc"});
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章