泛型之泛型類

泛型類

public class A<T> {
    //在成員變量上使用泛型
    private T t;
    
    public A() {}
    
    //構造參數類型上使用泛型
    public A(T t) {
       this.t = t;
    }
    
    //方法返回值上使用泛型
    public T getT() {
        return t;
    }
    
    //方法的參數上使用泛型
    //這是泛型類的方法,而不是泛型方法
    public void setT(T t) {
        this.t = t;
    }
    
    //方法的返回值和參數類型上使用泛型
    public T foo(T t) {
        return t;
    }
    
    public void foo2() {
        //T t = ....; //局部變量的引用類型上使用泛型
        //new T(); //不可以這樣使用
    }
    
    public void foo3() {
        //在創建泛型類對象時,即爲類型變量賦值,這裏將T賦值爲String類型
        A<String> a = new A<String>();
        //將T賦值爲Integer類型
        A<Integer> a1 = new A<Integer>();
    }
}

A是一個泛型類,T它是一個變量,需要賦類型值,如果有多個類型變量,就用逗號分隔,比如 Jdk 的 Map 接口:interface Map<K,V> {}
定義:具有一個或多個類型變量的類,稱之爲泛型類
泛型類是一個存在類型變量的類,存在可變的因素,所以說是一個不完整的類。那麼當子類去繼承的時候,把裏面的類型變量賦予了類型,那麼這個類就完整了,就可以使用了。

泛型類的繼承

public class B<T> {}

class BB extends B<String> {}

創建BB對象的兩種方式

  • B<String> b = new BB()
  • BB b = new BB()

錯誤方式

  • BB<String> bb = new BB<String>()

錯誤原因:BB 繼承了泛型類 B,但 BB 並不是泛型類,所以不能這樣創建對象。

public class C<T> {}

class CC<E> extends C<E> {}
class CCC<E> extends C<Integer> {}

創建CC對象

  • C<String> c = new CC<String>()
  • C<Integer> c = new CC<Integer>()

泛型引用和創建,兩端給出的泛型變量必須相同(等號前後的泛型類型應該保持一致),否則會報錯。
CC是泛型類,它的父類也泛型類,它可以給父類傳遞類型常量,也可以傳遞變量,這裏傳遞的是變量。
CCC同樣是泛型類,它的父類也是泛型類,它傳遞的是常量。

泛型類的子類重寫父類方法

public class D<T> {
    private T bean;
    
    public void setBean(T bean) {
        this.bean = bean;
    }
}

class DD<E> extends D<E> {
    /**
     * 子類重寫父類方法,參數類型必須是E,因爲子類在定義
     * 已經把類型E賦給了父類。
     */
    @Override
    public void setBean(E o) {
        //TODO
    }
}
class DDD<E> extends D<String> {
    //子類定義時已經把類型String賦給了父類,所以方法重寫時類型是String
    public void setBean(String str) {
        //TODO
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章