java中如何使用泛型
泛型的基本概念
泛型是Java中一种参数化类型的机制,允许在类、接口或方法中使用类型参数。泛型的主要目的是提高代码的重用性和类型安全性。
泛型类
定义一个泛型类时,需要在类名后面添加类型参数。类型参数可以是任何有效的标识符,通常使用大写字母如T、E、K、V等。
public class Box<T> {
private T content;
public void setContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
使用泛型类时,需要指定具体的类型参数:
Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");
String value = stringBox.getContent();
泛型方法
泛型方法可以在非泛型类中定义。泛型方法的类型参数声明在方法返回类型之前。
public <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
调用泛型方法时,可以显式指定类型参数或让编译器自动推断:
Integer[] intArray = {1, 2, 3};
printArray(intArray); // 自动推断类型参数为Integer
类型通配符
类型通配符用于表示未知类型,通常用?表示。通配符可以用于参数、字段或局部变量的类型。
public void processList(List<?> list) {
for (Object elem : list) {
System.out.println(elem);
}
}
有界类型参数
可以通过extends关键字限制类型参数的上界,或通过super关键字限制下界。
public <T extends Number> double sum(List<T> numbers) {
double total = 0.0;
for (T num : numbers) {
total += num.doubleValue();
}
return total;
}
泛型接口
接口也可以使用泛型,定义方式与泛型类类似。
public interface Pair<K, V> {
K getKey();
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;
}
public K getKey() { return key; }
public V getValue() { return value; }
}
类型擦除
Java的泛型是通过类型擦除实现的,编译器在编译时会移除所有类型参数信息。运行时无法获取泛型类型的具体信息。
List<String> stringList = new ArrayList<>();
List<Integer> intList = new ArrayList<>();
System.out.println(stringList.getClass() == intList.getClass()); // 输出true
泛型数组
由于类型擦除,Java不允许直接创建泛型数组。可以使用通配符类型或强制类型转换作为替代方案。
// 错误的写法
// List<String>[] arrayOfLists = new List<String>[10];
// 正确的替代方案
List<?>[] arrayOfLists = new List<?>[10];
arrayOfLists[0] = new ArrayList<String>();
泛型与继承
泛型类可以继承或扩展其他泛型类。子类可以保留父类的类型参数或指定具体类型。

public class ChildBox<T> extends Box<T> {
// 子类保留父类的类型参数
}
public class StringBox extends Box<String> {
// 子类指定具体类型参数
}






