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 指定一个具体的类型,如 IntegerString 等。

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 泛型提供了一种强大而灵活的方式来编写更类型安全的代码,同时减少了冗余的类型转换代码。