Java 泛型的使用
TIP
泛型(Generics)提供了编译时类型安全检测机制,允许在编译时检测到非法的类型。
泛型类
java
// 定义一个泛型类
public class Box<T> {
private T item;
public void set(T item) {
this.item = item;
}
public T get() {
return item;
}
}
// 使用
Box<String> stringBox = new Box<>();
stringBox.set("Hello");
String value = stringBox.get(); // 无需强转
Box<Integer> intBox = new Box<>();
intBox.set(123);泛型方法
java
public class Utils {
// 泛型方法,T 在方法返回类型前声明
public static <T> T getMiddle(T[] arr) {
return arr[arr.length / 2];
}
}
String mid = Utils.getMiddle(new String[]{"A", "B", "C"});类型通配符
java
// ? 无界通配符
public static void printList(List<?> list) {
for (Object obj : list) {
System.out.println(obj);
}
}
// ? extends T 上界通配符
public static double sum(List<? extends Number> list) {
double total = 0;
for (Number n : list) {
total += n.doubleValue();
}
return total;
}
// ? super T 下界通配符
public static void addNumbers(List<? super Integer> list) {
list.add(1);
list.add(2);
}类型擦除
WARNING
Java 泛型是伪泛型,在编译时会进行类型擦除:
- 泛型信息仅在编译阶段存在
- 编译后的字节码中会替换为原始类型(Object 或上界)
- 运行时无法获取到泛型的具体类型
java
List<String> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
System.out.println(list1.getClass() == list2.getClass()); // true