Java 泛型解讀

泛型的初認識

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

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("打印坐標:"+
point.getX()+","+point.getY());
}
}

通過使用泛型的例子與上篇做相應代碼比較可發現,在創建對象初始化坐標時比較方便,需要什么類型數據的坐標,直接在 <> 類加入相應的類名就行。

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

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

泛型的構造方法

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

Point<String> point1 = new Point<String>("經度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學習");
        read(info);
    }
    public static void read(Info<?> t) {
        //這里用 ?通配符代表任意類型,使用Object會出錯,不寫<?>會有警告
        System.out.println(t.toString());
    }
}

泛型接口

  • 泛型接口的創建于泛型類的創界并無大同,只是將 class 變為 interface, 但是實現接口的類必須將接口的方法實現。

泛型方法

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

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

泛型數組

  • 在創建一個泛型方法時,也可以傳遞或者返回一個泛型數組
class Gener{
    //傳遞一個泛型數組
    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","學","習"};
        gener.returnT(arr);
    }
}

泛型摩擦

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

總結 - 泛型的好處

  1. 類型安全
  2. 消除強制類型轉換
  3. 潛在性能收益
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

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