Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤和異常

Java 多執行緒

Java 同步

Java 網路

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 雜項

Java API 和框架

Java 類參考

Java 有用資源

Java - 泛型



如果我們可以編寫一個單一的排序方法,該方法可以對 Integer 陣列、String 陣列或任何支援排序型別的陣列中的元素進行排序,那就太好了。

為什麼在 Java 中使用泛型?

泛型用於建立這樣的介面方法,這些類、介面和方法具有可以同時操作不同資料型別的引數。此功能是在 Java 5 中引入的。

Java - 泛型

Java 泛型方法和泛型類使程式設計師能夠分別使用單個方法宣告指定一組相關方法,或者使用單個類宣告指定一組相關型別。

泛型還提供編譯時型別安全,允許程式設計師在編譯時捕獲無效型別。

使用 Java 泛型概念,我們可以編寫一個用於對物件陣列進行排序的泛型方法,然後使用 Integer 陣列、Double 陣列、String 陣列等呼叫泛型方法,對陣列元素進行排序。

Java 泛型的優勢

  • 不犧牲型別安全
  • 不需要型別轉換
  • 編譯時檢查
  • 程式碼重用性和改進的效能

Java 泛型的型別

泛型方法

您可以編寫一個可以呼叫不同型別引數的單個泛型方法宣告。根據傳遞給泛型方法的引數型別,編譯器會適當地處理每個方法呼叫。

定義泛型方法的規則

以下是定義泛型方法的規則:

  • 所有泛型方法宣告都具有一個由尖括號(< 和 >)分隔的型別引數部分,該部分位於方法的返回型別之前(在下一個示例中為 < E >)。

  • 每個型別引數部分包含一個或多個用逗號分隔的型別引數。型別引數,也稱為型別變數,是一個識別符號,用於指定泛型型別名稱。

  • 型別引數可用於宣告返回型別,並用作傳遞給泛型方法的引數型別的佔位符,這些引數稱為實際型別引數。

  • 泛型方法的主體像任何其他方法一樣宣告。請注意,型別引數只能表示引用型別,不能表示基本型別(如 int、double 和 char)。

Java 泛型方法示例

以下示例說明了如何使用單個泛型方法列印不同型別的陣列:

public class GenericMethodTest {
   // generic method printArray
   public static < E > void printArray( E[] inputArray ) {
      // Display array elements
      for(E element : inputArray) {
         System.out.printf("%s ", element);
      }
      System.out.println();
   }

   public static void main(String args[]) {
      // Create arrays of Integer, Double and Character
      Integer[] intArray = { 1, 2, 3, 4, 5 };
      Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
      Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };

      System.out.println("Array integerArray contains:");
      printArray(intArray);   // pass an Integer array

      System.out.println("\nArray doubleArray contains:");
      printArray(doubleArray);   // pass a Double array

      System.out.println("\nArray characterArray contains:");
      printArray(charArray);   // pass a Character array
   }
}

輸出

Array integerArray contains:
1 2 3 4 5 

Array doubleArray contains:
1.1 2.2 3.3 4.4 

Array characterArray contains:
H E L L O

有界型別引數

有時您可能希望限制允許傳遞給型別引數的型別的種類。例如,對數字進行操作的方法可能只希望接受 Number 或其子類的例項。這就是有界型別引數的用途。

要宣告有界型別引數,請列出型別引數的名稱,後跟 extends 關鍵字,後跟其上界。

有界型別引數示例

以下示例說明了 extends 如何以一般意義上表示“擴充套件”(如類)或“實現”(如介面)。此示例是返回三個 Comparable 物件中最大的泛型方法:

public class MaximumTest {
   // determines the largest of three Comparable objects
   
   public static <T extends Comparable<T>> T maximum(T x, T y, T z) {
      T max = x;   // assume x is initially the largest
      
      if(y.compareTo(max) > 0) {
         max = y;   // y is the largest so far
      }
      
      if(z.compareTo(max) > 0) {
         max = z;   // z is the largest now                 
      }
      return max;   // returns the largest object   
   }
   
   public static void main(String args[]) {
      System.out.printf("Max of %d, %d and %d is %d\n\n", 
         3, 4, 5, maximum( 3, 4, 5 ));

      System.out.printf("Max of %.1f,%.1f and %.1f is %.1f\n\n",
         6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ));

      System.out.printf("Max of %s, %s and %s is %s\n","pear",
         "apple", "orange", maximum("pear", "apple", "orange"));
   }
}

輸出

Max of 3, 4 and 5 is 5

Max of 6.6,8.8 and 7.7 is 8.8

Max of pear, apple and orange is pear

泛型類

泛型類宣告看起來像非泛型類宣告,只是類名後跟一個型別引數部分。

與泛型方法一樣,泛型類的型別引數部分可以包含一個或多個用逗號分隔的型別引數。這些類稱為引數化類或引數化型別,因為它們接受一個或多個引數。

泛型類示例

以下示例說明了如何定義泛型類:

public class Box<T> {
   private T t;

   public void add(T t) {
      this.t = t;
   }

   public T get() {
      return t;
   }

   public static void main(String[] args) {
      Box<Integer> integerBox = new Box<Integer>();
      Box<String> stringBox = new Box<String>();
    
      integerBox.add(new Integer(10));
      stringBox.add(new String("Hello World"));

      System.out.printf("Integer Value :%d\n\n", integerBox.get());
      System.out.printf("String Value :%s\n", stringBox.get());
   }
}

輸出

Integer Value :10
String Value :Hello World
廣告