Java 泛型解讀

泛型的初認(rèn)識

  1. 泛型是在JDK1.5之后增加的新功能。泛型(Generic)
  2. 泛型可以解決數(shù)據(jù)類型的安全性問題,在類的聲明時通過一個標(biāo)示表示類中某個屬性的類型或者是某個方法的返回值及參數(shù)類型。
  3. 大致格式:
    • 訪問權(quán)限 class 類名稱 <泛型,泛型,...> {
      屬性
      方法
      }
  4. 對象的創(chuàng)建: 類名稱<具體類型> 對象名稱 = new 類名稱<具體類型>();
  • 將上篇泛型認(rèn)識前篇中的 Point 類用泛型優(yōu)化

class Point<T>{
private T x;
private T y;
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
public T getY() {
return y;
}
public void setY(T y) {
this.y = y;
}
}
public class Generics {
public static void main(String[] args) {
// TODO Auto-generated method stub
Point<Integer> point = new Point<Integer>();
point.setX(10);
point.setY(29);
System.out.println("打印坐標(biāo):"+
point.getX()+","+point.getY());
}
}

通過使用泛型的例子與上篇做相應(yīng)代碼比較可發(fā)現(xiàn),在創(chuàng)建對象初始化坐標(biāo)時比較方便,需要什么類型數(shù)據(jù)的坐標(biāo),直接在 <> 類加入相應(yīng)的類名就行。

- 指定多個泛型,只需在尖括號 <> 中用逗號“,”分開就行。例如:

    ```
class Demo<T,K>{
    private T take;
    private K key;        
}

泛型的構(gòu)造方法

  • 構(gòu)造方法可以為類中的屬性初始化,那么如果類中的屬性通過泛型指定,又需要構(gòu)造方法來設(shè)置其內(nèi)容的時候,那么構(gòu)造方法的定語與普通類的構(gòu)造方法并無大同,不需要像聲明類那樣指定泛型。
    • 在上訴代碼 泛型類 Point 中加入構(gòu)造方法:
public Point(T x,T y){
    this.x = x;
    this.y = y;
}
- 在對象實例化時使用構(gòu)造方法:
```

Point<String> point1 = new Point<String>("經(jīng)度1","緯度2");
```

泛型 - 通配符

class Info<T>{
    private T key;
    public T getKey() {
        return key;
    }
    public void setKey(T key) {
        this.key = key;
    }
    @Override
    public String toString(){
        return this.getKey().toString();
    }
}

public class Generics2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Info<String> info = new Info<String>();
        info.setKey("Java學(xué)習(xí)");
        read(info);
    }
    public static void read(Info<?> t) {
        //這里用 ?通配符代表任意類型,使用Object會出錯,不寫<?>會有警告
        System.out.println(t.toString());
    }
}

泛型接口

  • 泛型接口的創(chuàng)建于泛型類的創(chuàng)界并無大同,只是將 class 變?yōu)?interface, 但是實現(xiàn)接口的類必須將接口的方法實現(xiàn)。

泛型方法

  • 泛型方法與泛型類并沒有必然的聯(lián)系,泛型方法有自己的類型參數(shù),在普通類中也可以定義泛型方法。泛型方法中的T1、T2與泛型類中的T1、T2沒有必然的聯(lián)系,也可以使用其他的標(biāo)識符來代替。
  • 泛型方法中可以定義泛型參數(shù),此時參數(shù)的類型就是傳入的數(shù)據(jù)類型
class Gener{
    //泛型方法 返回一 T 類型的數(shù)據(jù) 
    public <T> T returnT(T t) { 
        return t;    
        }
}
public class Generics3 {

    public static void main(String[] args) {
        Gener gener = new Gener();
        //泛型方法的調(diào)用方便傳入任意類型的數(shù)據(jù)
        String str  = gener.returnT("Java學(xué)習(xí)");
        System.out.println(str);
        int i = gener.returnT(10);
        System.out.println(i);
    }
}

泛型數(shù)組

  • 在創(chuàng)建一個泛型方法時,也可以傳遞或者返回一個泛型數(shù)組
class Gener{
    //傳遞一個泛型數(shù)組
    public <T> void returnT(T t[]) { 
            for (int i = 0; i < t.length; i++) {
                System.out.print(t[i]);
            }
        }
}
public class Generics3 {

    public static void main(String[] args) {
        Gener gener = new Gener();
        String arr[] ={"Java","學(xué)","習(xí)"};
        gener.returnT(arr);
    }
}

泛型摩擦

  • 如在定義某一個泛型類,在實例化過程中,沒有指明具體類型,那么就是自動擦除泛型類型。編譯器就將生成一種與泛型類同名的原始類,但是類型參數(shù)都被刪除了。

總結(jié) - 泛型的好處

  1. 類型安全
  2. 消除強制類型轉(zhuǎn)換
  3. 潛在性能收益
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 我們知道,使用變量之前要定義,定義一個變量時必須要指明它的數(shù)據(jù)類型,什么樣的數(shù)據(jù)類型賦給什么樣的值。 假如我們現(xiàn)在...
    e347afbb188e閱讀 309評論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,662評論 18 399
  • 對象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法,而不是構(gòu)造函數(shù)創(chuàng)建對象:僅僅是創(chuàng)建對象的方法,并非Fa...
    孫小磊閱讀 2,183評論 0 3
  • 三月末,為了黿頭渚的櫻花,幾乎是說走就走買了動車票。 因為目的性強,無錫的其他地方我沒有去。(實際上,無錫除了黿頭...
    Mildred_inside閱讀 1,465評論 4 7
  • 序 在故事開始之前的這一部分,純粹是敘述者的自言自語,趕時間的讀者大可跳過不看。 不過從某種程度上來說,整本書無非...
    漁盞閱讀 526評論 1 2

友情鏈接更多精彩內(nèi)容