Java泛型是Java语言中的一个特性,它允许你在类、接口和方法上定义类型参数。使用泛型可以使代码更加通用,减少代码重复,并在编译时提供更强的类型检查。下面分别介绍泛型类、泛型方法和泛型接口。
泛型类
泛型类是在类名后添加类型参数声明的类。这种类型参数可以在类的整个定义中使用,如构造方法、成员变量和普通方法中。
示例
public class Box<T> {private T t;public void set(T t) {this.t = t;}public T get() {return t;}
}
在这个例子中,Box
类使用了类型参数T
,这意味着它可以用来存储任何类型的对象。创建Box
实例时,你可以指定具体的类型:
Box<Integer> integerBox = new Box<>();
integerBox.set(10);
Integer someInteger = integerBox.get();
泛型方法
泛型方法是在方法返回类型之前有一个类型参数声明的方法。这个类型参数可以在方法的参数类型、返回类型和局部变量类型中使用。
示例
public class Util {public static <T> void printArray(T[] inputArray) {for (T element : inputArray) {System.out.println(element);}}
}
这个printArray
方法是一个泛型方法,它可以接受任意类型的数组并打印每个元素。调用泛型方法时,可以根据传递
Integer[] intArray = {1, 2, 3, 4, 5};
Util.<Integer>printArray(intArray); // 显式类型
Util.printArray(intArray); // 类型推导
的参数类型自动推导出具体的类型,也可以显式指定类型:
泛型接口
泛型接口与泛型类类似,是在接口名后添加类型参数声明的接口。这个类型参数可以在接口的方法中使用。
示例
public interface Pair<K, V> {public K getKey();public V getValue();
}public class OrderedPair<K, V> implements Pair<K, V> {private K key;private V value;public OrderedPair(K key, V value) {this.key = key;this.value = value;}@Overridepublic K getKey() {return key;}@Overridepublic V getValue() {return value;}
}
在这个例子中,Pair
是一个泛型接口,它定义了两个类型参数K
和V
。OrderedPair
类实现了Pair
接口,并指定了键和值的类型。
注意事项
- 使用泛型可以增加代码的复用性和类型安全,但也应避免过度使用。
- 在泛型代码中,不能使用基本数据类型(如
int
、double
等),只能使用它们的包装类(如Integer
、Double
等)。 - 泛型信息在编译时会进行类型擦除,这意味着泛型类型参数在运行时并不保留具体的类型信息。