泛型(Generics)是Java语言中的一个重要特性,它提供了编译时类型安全检查的机制,可以用来创建可以处理不同数据类型的类和方法,同时保持类型安全。以下是泛型的一些基本使用方法:
1. 泛型类
泛型类可以定义一个或多个类型参数。例如,一个简单的泛型类:
java
public class Box {
private T t; // T stands for “Type”
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
使用泛型类:
java
Box integerBox = new Box();
integerBox.set(10); // 自动装箱
Integer someInteger = integerBox.get();
2. 泛型接口
泛型也可以用在接口上:
java
public interface Generator {
T next();
}
实现泛型接口:
java
public class FruitGenerator implements Generator {
private String[] fruits = new String[]{“Apple”, “Banana”, “Cherry”};
public String next() {
return fruits[(int) (Math.random() * fruits.length)];
}
}
3. 泛型方法
泛型方法可以独立于类而存在:
java
public class Util {
public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
return p1.getKey().equals(p2.getKey()) &&
p1.getValue().equals(p2.getValue());
}
}
使用泛型方法:
java
Pair<String, Integer> p1 = new Pair<>(“one”, 1);
Pair<String, Integer> p2 = new Pair<>(“one”, 2);
boolean same = Util.<String, Integer>compare(p1, p2); // 显式类型参数
4. 类型通配符
类型通配符通常用于泛型方法中,表示未知类型:
java
public static void printList(List<?> list) {
for (Object item : list) {
System.out.println(item);
}
}
5. 上界通配符(<? extends E>)
表示类型参数是E或E的子类:
java
public static void addNumbers(List<? extends Number> list) {
// 可以添加Number的任何子类型的元素
}
6. 下界通配符(<? super E>)
表示类型参数是E或E的超类:
java
public static void addNumbers(List<? super Integer> list) {
list.add(1); // 可以添加Integer或其父类型的元素
}
7. 泛型数组
Java不支持直接创建泛型数组,但可以通过类型擦除后的桥接方法来创建泛型数组的引用:
java
List[] stringLists = new List[1]; // 编译错误
List<?>[] lists = new List<?>[1]; // OK,但会有警告
List[] stringLists2 = (List[]) lists; // 类型转换
泛型的使用提高了代码的复用性和类型安全性,减少了类型转换的次数,是Java编程中非常重要的一个概念。在编写代码时,应当尽可能使用泛型来提高程序的健壮性和可维护性。