一、泛型類的基本概念
1. 什么是泛型類
泛型類是指使用類型參數定義的類,可以在類定義時不指定具體類型,而在實例化時指定。
2. 泛型類的作用
-
類型安全:編譯時檢查類型匹配
-
消除強制轉換:減少運行時ClassCastException風險
-
代碼復用:同一套邏輯可適用于多種類型
-
提高可讀性:代碼意圖更明確
二、泛型類的基本語法
1. 定義泛型類
// T是類型參數,可以是任何非關鍵字標識符
public class Box<T> {private T content;public void setContent(T content) {this.content = content;}public T getContent() {return content;}
}
2. 使用泛型類
Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");
String str = stringBox.getContent(); // 不需要強制轉換Box<Integer> intBox = new Box<>();
intBox.setContent(123);
int num = intBox.getContent(); // 自動拆箱
三、泛型類的多類型參數
public class Pair<K, V> {private K key;private V value;public Pair(K key, V value) {this.key = key;this.value = value;}public K getKey() { return key; }public V getValue() { return value; }public void setKey(K key) { this.key = key; }public void setValue(V value) { this.value = value; }
}// 使用示例
Pair<String, Integer> pair = new Pair<>("Age", 25);
String key = pair.getKey();
int value = pair.getValue();
四、泛型類的類型邊界
1. 上界通配符(extends)
public class NumberBox<T extends Number> {private T number;public double getDoubleValue() {return number.doubleValue(); // 可以調用Number的方法}
}// 只能使用Number及其子類
NumberBox<Integer> intBox = new NumberBox<>();
NumberBox<Double> doubleBox = new NumberBox<>();
// NumberBox<String> stringBox = new NumberBox<>(); // 編譯錯誤
2. 多重邊界
public class MultiBound<T extends Number & Comparable<T> & Serializable> {// T必須是Number的子類,且實現了Comparable和Serializable
}
五、泛型類的繼承關系
1. 泛型類可以繼承非泛型類
public class GenericChild<T> extends NonGenericParent {// ... }
2. 泛型類可以繼承泛型類
public class Child<T> extends Parent<T> {// 使用相同的類型參數 }public class StringChild extends Parent<String> {// 指定具體類型 }
六、泛型類與靜態成員
public class StaticGeneric<T> {// 靜態成員不能使用類的類型參數// private static T staticField; // 編譯錯誤// 靜態方法可以定義自己的類型參數public static <E> E staticMethod(E input) {return input;} }
七、泛型類的類型擦除
Java泛型是通過類型擦除實現的,編譯后會去除類型參數信息:
// 編譯前 Box<String> box = new Box<>(); box.setContent("Hello");// 編譯后(近似) Box box = new Box(); box.setContent((Object)"Hello"); String str = (String)box.getContent();
八、泛型類的高級用法
1. 通配符(?)
public void processList(List<?> list) {// 可以接受任何類型的Listfor (Object item : list) {System.out.println(item);}
}public void processNumberList(List<? extends Number> list) {// 接受Number及其子類的Listfor (Number num : list) {System.out.println(num.doubleValue());}
}
2. PECS原則(Producer-Extends, Consumer-Super)
// 生產者使用extends public void copyFrom(List<? extends Number> src, List<? super Number> dest) {for (Number num : src) {dest.add(num);} }
九、泛型類的限制
-
不能創建泛型數組
// T[] array = new T[10]; // 編譯錯誤
-
不能實例化類型參數
// T obj = new T(); // 編譯錯誤
-
不能用于靜態上下文
// private static T staticField; // 編譯錯誤
-
基本類型不能作為類型參數
// List<int> list = new ArrayList<>(); // 編譯錯誤 // 必須使用包裝類 List<Integer> list = new ArrayList<>();
十、泛型類的實際應用
1. 集合框架
List<String> strings = new ArrayList<>(); Map<Integer, String> map = new HashMap<>();
2. 自定義容器
public class Cache<T> {private Map<String, T> cacheMap = new HashMap<>();public void put(String key, T value) {cacheMap.put(key, value);}public T get(String key) {return cacheMap.get(key);}
}
3. 工具類
public class MathUtils {public static <T extends Number> double average(Collection<T> numbers) {double sum = 0.0;for (T num : numbers) {sum += num.doubleValue();}return sum / numbers.size();}
}
十一、總結
Java泛型類的主要特點:
-
通過類型參數實現通用編程
-
提供編譯時類型安全檢查
-
消除強制類型轉換
-
支持類型邊界限制
-
通過類型擦除實現
合理使用泛型類可以:
-
提高代碼的類型安全性
-
增強代碼的可讀性和可維護性
-
減少重復代碼
-
構建更靈活的API