Java泛型
1. 泛型的基本概念
定义泛型类和泛型方法
泛型类:
public class Box<T> { private T t;public void set(T t) { this.t = t; }
public T get() { return t; } }
在上面的例子中,T 是类型参数,它将在实例化 Box 类时被具体化。\
泛型方法:
public class Util {
public static <T> void printArray(T[] inputArray) {
for (T element : inputArray) {
System.out.printf("%s ", element);
}
System.out.println();
}
}
在这里,<T> 表示该方法是泛型方法,T 可以是任何类型。
2. 使用泛型
泛型类的使用
Box<Integer> integerBox = new Box<>();
integerBox.set(10);
Integer someInteger = integerBox.get();
System.out.println(someInteger); // 输出:10泛型方法的使用
Integer[] intArray = {1, 2, 3, 4, 5}; Util.printArray(intArray); // 输出:1 2 3 4 5
String[] stringArray = {"Hello", "World"}; Util.printArray(stringArray); // 输出:Hello World
3. 泛型的高级特性
限定通配符
上界通配符:使用 extends 关键字
public static void printNumbers(List<? extends Number> list) {
for (Number n : list) {
System.out.println(n);
}
}
下界通配符:使用 super 关键字
public static void addNumbers(List<? super Integer> list) {
list.add(10);
list.add(20);
}类型擦除
Java 的泛型是通过类型擦除来实现的,这意味着在编译时,泛型信息被移除,所有的泛型参数类型被替换为其边界或 Object(如果没有指定边界)。这保证了向后兼容性,但也带来了一些限制
public static void printList(List<Object> list) {
for (Object elem : list) {
System.out.println(elem);
}
}泛型和数组
由于类型擦除的存在,Java 不支持创建泛型数组:
// 不合法的语法
List<Integer>[] arrayOfLists = new List<Integer>[2];4. 常见问题
泛型类型参数的实例化
由于类型擦除,不能直接实例化泛型类型参数:
public class Box<T> { private T t;
public Box() { // t = new T(); // 错误:无法实例化泛型类型 } }
静态上下文中的泛型类型参数
静态方法和静态变量不能引用类的类型参数:
public class Box<T> {
private static T t; // 错误:无法在静态上下文中使用泛型类型参数
}