核心概念
????????Java 泛型是 Java SE 1.5 引入的一項重要特性,它的核心思想是 參數化類型(Parameterized Types),即通過將數據類型作為參數傳遞給類、接口或方法,使代碼能夠靈活地處理多種類型,同時保證類型安全性。
一、基本語法
1. 泛型類/接口
????????在類名后添加類型參數 <T>,T 是占位符(可以是任意標識符),聲明后類的占位符會被替換成對應類型
public class Box<T> {private T content;public void setContent(T content) { this.content = content; }public T getContent() { return content; }
}// 使用
Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");
String value = stringBox.getContent(); // 無需強制轉換
2.泛型接口
public interface ITest<T> {void show(T t);
}public class TestImpl implements ITest<String> {@Overridepublic void show(String t) {System.out.println(t);}
}
3.泛型方法
- 作為傳參:在方法返回類型前聲明類型參數 <T>:
//???修飾符? <T>? 返回值類型 方法名(T 變量名){
public <T> void printArray(T[] array) {for (T element : array) {System.out.println(element);}
}// 調用時可顯式指定類型或由編譯器推斷
printArray(new Integer[]{1, 2, 3});
- 作為返回值:使用 Class<T> 參數傳遞類型信息
public <T> T convert(Object input, Class<T> targetType) {if (targetType == String.class) {return targetType.cast(input.toString()); // 轉成 String} else if (targetType == Integer.class) {return targetType.cast(Integer.parseInt(input.toString())); // 轉成 Integer}throw new IllegalArgumentException("不支持的類型: " + targetType);
}//調用
String strResult = convert(123, String.class); // 返回 "123"(String 類型)
Integer intResult = convert("456", Integer.class); // 返回 456(Integer 類型)
二、泛型通配符<?>
1. 無界通配符 <?>
- 作為傳參:表示接受任何類型
public void processList(List<?> list) {for (Object elem : list) { /* ... */ }
}
- 作為返回值:表示返回任何類型
public List<?> getData() {List<Food> resultList = new ArrayList<>();return resultList;}
2. 上界通配符 <? extends T>
????????接受 T 或其子類(適合讀取數據):
public double sum(List<? extends Number> list) {double sum = 0.0;for (Number num : list) { sum += num.doubleValue(); }return sum;
}
3. 下界通配符 <? super T>
????????接受 T 或其父類(適合寫入數據):
public void addNumbers(List<? super Integer> list) {list.add(1);list.add(2);
}
4. PECS 原則(Producer-Extends, Consumer-Super)
- 生產者(Producer):提供數據時用 extends(如 List<? extends T>)
- 消費者(Consumer):消費數據時用 super(如 List<? super T>)
三、實際應用場景
1.?REST API 響應封裝
public class ApiResponse<T> {private int code;private String message;private T data; // 泛型數據// 構造方法和Getter/Setterpublic static <T> ApiResponse<T> success(T data) {ApiResponse<T> response = new ApiResponse<>();response.setCode(200);response.setData(data);return response;}
}// 使用
ApiResponse<User> userResponse = ApiResponse.success(user);
ApiResponse<List<Product>> productResponse = ApiResponse.success(products);
2.Java 的集合框架(如 ArrayList<T>, HashMap<K,V>)
List<String> names = new ArrayList<>();
names.add("Alice");
String name = names.get(0); // 不需要強制轉換
3.工具類方法
????????泛型方法可用于編寫通用的工具類,例如排序、查找等。
public static <T extends Comparable<T>> T max(T a, T b) {return a.compareTo(b) > 0 ? a : b;
}