java 如何定义泛型
泛型的基本定义
在Java中,泛型通过类型参数(<T>)实现,允许类、接口或方法在定义时使用占位符类型,实际使用时再指定具体类型。泛型的核心目的是提高代码复用性和类型安全性。
类定义示例:
public class Box<T> {
private T content;
public void setContent(T content) { this.content = content; }
public T getContent() { return content; }
}
T是类型参数,使用时可以替换为具体类型(如Integer、String)。
泛型方法
泛型方法可以在非泛型类中定义,方法独立声明类型参数:
public <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
- 调用时根据传入的数组类型推断
T,例如printArray(new String[]{"a", "b"})。
多类型参数
泛型支持多个类型参数,用逗号分隔:
public class Pair<K, V> {
private K key;
private V value;
// 构造方法和getter/setter省略
}
- 示例:
Pair<String, Integer> pair = new Pair<>("age", 25);
泛型接口
接口同样可以使用泛型:
public interface Repository<T> {
void save(T entity);
T findById(int id);
}
- 实现类需指定具体类型或保留泛型参数。
类型通配符
用于处理未知的泛型类型,常见于方法参数:
<?>表示未知类型(无限制)。<? extends Number>表示上限为Number或其子类。<? super Integer>表示下限为Integer或其父类。
示例:

public void processList(List<? extends Number> list) {
for (Number num : list) {
System.out.println(num.doubleValue());
}
}
泛型限制
- 不能实例化类型参数:
T obj = new T();是非法的。 - 不能用于静态上下文:静态变量或方法不能使用类的类型参数。
- 类型擦除:运行时泛型信息会被擦除,转换为原生类型(如
Box<T>变为Box)。
实际应用场景
- 集合框架:如
ArrayList<String>确保类型安全。 - 工具类:通用数据处理(如转换、比较)。
- 设计模式:如工厂模式返回泛型对象。
通过合理使用泛型,可以减少类型转换错误并增强代码可读性。






