Java 泛型(Generics)是 JDK 5 中引入的一个新特性,它允许在定义类、接口和方法时使用类型参数。泛型的主要目的是提高 Java 程序的类型安全,同时减少类型转换的代码量。
1. 泛型类
泛型类是在定义类时使用类型参数。例如,一个简单的泛型类 Box
可以定义为:
java复制代码
public class Box<T> {
private T t;
public void set(T t) { this.t = t; }
public T get() { return t; }
}
在上面的代码中,T
是一个类型参数。当创建 Box
类的实例时,可以为 T
指定一个具体的类型,如 Integer
、String
等。
2. 泛型方法
除了泛型类,Java 还支持泛型方法。泛型方法允许在方法签名中声明类型参数。例如:
java复制代码
public class Utility {
public static <T> void print(T input) {
System.out.println(input);
}
}
在上面的代码中,<T>
在方法返回类型之前声明,表示这是一个泛型方法。
3. 类型通配符
Java 泛型还支持类型通配符,用 ?
表示。类型通配符可以提高 API 的灵活性。例如:
java复制代码
public void printBox(Box<?> box) {
System.out.println(box.get());
}
上面的代码可以接受任何类型的 Box
。
4. 有界类型参数
有时,你可能想限制泛型类型参数的范围。这可以通过有界类型参数实现。例如:
java复制代码
public class NumberBox<T extends Number> {
private T t;
public void set(T t) { this.t = t; }
public T get() { return t; }
}
在上面的代码中,T
被限制为 Number
或其子类。
5. 类型擦除
需要注意的是,Java 的泛型是通过类型擦除实现的。这意味着泛型信息在编译时被处理,并且在运行时被擦除。因此,你不能在运行时查询一个对象是否是特定的泛型类型。
总之,Java 泛型提供了一种强大而灵活的方式来编写更类型安全的代码,同时减少了冗余的类型转换代码。