泛型接口和方法

泛型接口

  • 定義泛型接口
    在 JDK 1.5之後,不僅可以在接口上聲明泛型,聲明格式與之前類似,是咋接口名稱後面加上< T>即可。格式如下:
【訪問權限】 interface 接口名稱<泛型標識>{}

下面利用以上定義一個泛型接口:
【定義一個泛型接口】

interface Info<T>{
    public T getVar();
}
  • 泛型接口實現的兩種方式
    泛型接口定義完成之後,就要定義此接口的子類,定義泛型接口的子類有兩種方式,一種是直接在子類後聲明泛型,另一種是直接在子類實現的接口中明確的給出泛型類型。
    【定義子類方式-1】——在子類的定義上聲明泛型類型
inteface Info<T>{
    public T getVar();
}
class InfoImpl<T> implements Info<T>
{
    private T var;
    public InfoImpl(T var){
        this.setVar(var);
    }
    public void setVar(T var){
        this.var=var;
    }
    public T getVar(){
        return this.var;
    }
}

以上程序泛型接口的子類聲明瞭與接口中同樣的泛型標識,使用以上子類的方式與前面的程序類似。
使用泛型接口的子類

public class GenericsDemo24
{
    public static void main(String args[]){
        Info<String> i=null;
        i=new InfoImpl<String>("張三");
        System.out.println("姓名:"+i.getVar());
    }
}

運行結果:

---------- java ----------
姓名:張三

以上程序不難理解,雖然指定了泛型,但是依然可以使用對象的多態性通過一個子類爲接口實例化。
【定義子類方式-2】——直接在接口中指定具體類型

interface Info<T>{
    public T getVar();
};
class InfoImpl implements Info<String>
{
    private String var;
    public InfoImpl(String var){
        this.setVar(var);
    }
    public void setVar(String var){
        this.var=var;
    }
    public String getVar(){
        return this.var;
    }
};

以上程序泛型接口的子類正在實現接口時,直接在實現的接口處指定了具體的泛型類型String,這樣在覆寫Info接口中的getVar()方法是直接聲明類型爲String類型。
使用泛型接口的子類:

public class GenericsDemo25
{
    public static void main(String args[]){
        Info<String> i=null;
        i=new InfoImpl("張三");
        System.out.println("姓名:"+i.getVar());
    }
}

運行結果:

---------- java ----------
姓名:張三

泛型方法

前面學習的所有泛型操作都是將整個類進行泛型化,但同樣也可以在類中定義泛型化的方法。泛型方法的定義與其所在的類是否是泛型類是否沒有任何關係,所在的類可以是泛型類,也可以不是泛型類。

  • 定義泛型方法
    在方形方法中可以定義泛型參數,此時,參數的類型就是傳入數據的類型,可以使用如下的格式定義泛型方法。
    【泛型方法的簡單定義】
【訪問權限】<泛型標識> 泛型標識 方法名稱([泛型標識 參數名稱])

【定義一個泛型方法】

class Demo
{
    public<T> T fun(T t){
        return t;
    } 
}
public class GenericsDemo26
{
    public static void main(String args[]){
        Demo d=new Demo();
        String str=d.fun("張三");
        int i=d.fun(30);
        System.out.println(str);
        System.out.println(i);
    }   
}

運行結果:

---------- java ----------
張三
30

以上程序的fun()方法是將接收到的參數直接返回,而且因爲在方法接收參數中使用了泛型操作,所以此方法可以接收任意類型的數據,而且此方法的返回值類型將由泛型指定。

  • 通過泛型方法返回泛型類實例
    如果可以通過泛型方法返回一個泛型類的實例化對象,則必須在方法的返回類型聲明處明確的指定泛型標識。
    【通過方法返回泛型類實例】
class Info<T extends Number>
{
    private T var;
    public T getVar(){
        return var;
    }
    public void setVar(T var){
        this.var=var;
    }
    public String toString(){
        return this.var.toString();
    }
}
public class GenericsDemo27
{
    public static void main(String args[]){
        Info<Integer> i=fun(30);
        System.out.println(i.getVar());
    }
    public static <T extends Number> Info<T> fun(T param){
        Info<T> temp =new Info<T>();
        temp.setVar(param);
        return temp;
    }
}

運行結果:

---------- java ----------
30

上面的代碼中的fun()方法在static關鍵字處定義了“ < T extends Number>”的意思是,方法中傳入或返回的泛型類型由調用方法時所設置的參數類型決定。

  • 使用泛型統一傳入的參數類型
    如果現在一個方法要求傳入的泛型對象的泛型類型一致,也可以通過泛型方法指定。
    【統一輸入對象的泛型類型】
class Info<T>
{
    private T var;
    public T getVar(){
        return var;
    }
    public void setVar(T var){
        this.var=var;
    }
    public String toString(){
        return this.var.toString();
    }
}
public class GenericsDemo28
{
    public static void main(String args[]){
        Info<String> i1=new Info<String>();
        Info<String> i2=new Info<String>();
        i1.setVar("Hello");
        i2.setVar("張三");
        add(i1,i2);
    }
    public static <T>void add(Info<T> i1,Info<T> i2){
        System.out.println(i1.getVar()+" "+i2.getVar());
    }
}

運行結果:

---------- java ----------
Hello 張三

上面程序中add()方法中的兩個Info對象的泛型類型必須一致。如果設置的類型不一致策在編譯的時候會出現錯誤,有興趣可以動手試一下。

泛型與子類繼承的限制
一個類的子類可以通過對象的多態性爲其父類實例化,但是在泛型操作中,子類類型是無法使用父類的泛型類型接收的,例如,Info < String>不能使用Info < Object>接收。

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