1. 为什么需要泛型?
十年前我刚接触Java集合框架时,经常遇到这样的场景:从ArrayList取出元素时需要进行强制类型转换,不仅代码冗长,更可能在运行时抛出ClassCastException。这种类型安全问题直到Java 5引入泛型才得到根本解决。
泛型(Generics)本质是参数化类型,就像给容器类装上类型安检机。当你声明List<String>时,相当于告诉编译器:"这个列表只接受String类型,其他类型一律拦截"。这种在编译期就能发现类型错误的机制,让Java从"类型体操"语言进化成了真正的强类型语言。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 泛型基础语法全解析
2.1 类型参数命名规范
虽然理论上可以用单个字母作为类型参数(如<T>),但实际开发中更推荐使用有意义的命名:
<E>表示集合元素(Element)<K>/<V>表示键值对(Key/Value)<T>表示通用类型(Type)<R>表示返回值类型(Return)
这种命名习惯能让代码自文档化。例如看到Map<K,V>接口定义时,即使不看注释也能理解类型参数用途。
2.2 泛型类定义实战
下面是一个带泛型参数的缓存类实现:
java复制public class GenericCache<T> {
private T data;
public void put(T item) {
this.data = item;
}
public T get() {
return data;
}
}
使用时:
java复制GenericCache<String> stringCache = new GenericCache<>();
stringCache.put("hello"); // 编译通过
stringCache.put(123); // 编译报错
2.3 泛型方法深度剖析
泛型方法可以独立于类存在,典型场景是工具类中的通用操作。注意类型参数声明的位置:
java复制public static <T> T getFirst(List<T> list) {
return list.g
