泛型(Generics)是 JDK 5 引入的特性,提供編譯期型別安全檢查,本質是參數化型別——將操作的資料型別指定為參數。
需求:寫一個排序方法,能處理整數陣列、字串陣列等任意型別陣列。
解答:使用 Java 泛型撰寫單一方法,編譯器自動適配各型別參數。
宣告規則:
<E> 置於回傳型別之前public class GenericMethodTest {
public static <E> void printArray(E[] inputArray) {
for (E element : inputArray) System.out.printf("%s ", element);
System.out.println();
}
public static void main(String[] args) {
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("整型陣列元素:"); printArray(intArray);
System.out.println("\n雙精度陣列元素:"); printArray(doubleArray);
System.out.println("\n字元陣列元素:"); printArray(charArray);
}
}
整型陣列元素: 1 2 3 4 5 雙精度陣列元素: 1.1 2.2 3.3 4.4 字元陣列元素: H E L L O
限制型別參數範圍,語法:<T extends Comparable<T>>(extends 兼具「繼承類別」與「實作介面」含義)。
public class MaximumTest {
public static <T extends Comparable<T>> T maximum(T x, T y, T z) {
T max = x;
if (y.compareTo(max) > 0) max = y;
if (z.compareTo(max) > 0) max = z;
return max;
}
public static void main(String[] args) {
System.out.printf("%d, %d, %d 最大為 %d\n", 3,4,5, maximum(3,4,5));
System.out.printf("%.1f, %.1f, %.1f 最大為 %.1f\n", 6.6,8.8,7.7, maximum(6.6,8.8,7.7));
System.out.printf("%s, %s, %s 最大為 %s\n", "pear","apple","orange", maximum("pear","apple","orange"));
}
}
3, 4, 5 最大為 5 6.6, 8.8, 7.7 最大為 8.8 pear, apple, orange 最大為 pear
類別名稱後添加型別參數宣告:class Box<T>。
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> intBox = new Box<>();
Box<String> strBox = new Box<>();
intBox.add(10);
strBox.add("菜鳥教程");
System.out.printf("整型值: %d\n", intBox.get());
System.out.printf("字串: %s\n", strBox.get());
}
}
整型值: 10 字串: 菜鳥教程
List<?>邏輯上為所有 List<具體型別> 的父類型。
public static void getData(List<?> data) { System.out.println("data: " + data.get(0)); }
// 可傳入 List<String>、List<Integer>、List<Number>
List<? extends Number>僅接受 Number 及其子類型。
public static void getUpperNumber(List<? extends Number> data) { ... }
// List<Integer> ✓, List<Number> ✓, List<String> ✗ (編譯錯誤)
List<? super Number>接受 Number 及其父類型(如 Object)。