一、什么是Java泛型?
Java泛型,JDK 5加入了,让定义类、接口、方法时,能声明类型。通过
<>
符号指定类型变量(如
T
、
E
、
K
、
V
),实现类型安全的代码复用。例如:
List<String> stringList = new ArrayList<>(); // 泛型集合 Map<String, Integer> scoreMap = new HashMap<>(); // 泛型映射
二、泛型的核心优势
类型安全
编译时检查类型,避免
ClassCastException
。如:
java List nums = new ArrayList<>(); nums.add("Hello"); // 编译报错
undefined
代码复用
通过泛型方法实现通用逻辑:
public <T> void printList(List<T> list) { for (T item : list) System.out.println(item); }
消除类型转换
泛型集合自动识别元素类型:
java List doubles = new ArrayList<>(); Double num = doubles.get(0); // 无需强制转换
undefined
三、泛型的底层原理:类型擦除
Java通过类型擦除实现泛型兼容性:
编译时检查类型,生成普通类型代码(如
List<String>
转为
List
)
使用桥接方法(bridge method)处理多态:
public void add(String e) { // 桥接方法 super.add(e); }
四、泛型的高级应用
1. 通配符与PECS原则
无界通配符
<?>
:表示任意类型
上限通配符
<? extends T>
:接收子类实例
下限通配符
<? super T>
:接收父类实例
PECS原则:
生产者用
<? extends T>
(如
List<? extends Number>
)
消费者用
<? super T>
(如
List<? super Integer>
)
2. 泛型方法与构造器
// 泛型方法 public <K, V> void printMap(Map<K, V> map) { for (Map.Entry<K, V> entry : map.entrySet()) System.out.println(entry.getKey() + " -> " + entry.getValue()); } // 泛型构造器public class Box<T> { private T content; public <X> Box(X x) { // 静态方法需声明泛型 this.content = (T)x; // 需强制转换 } } ``` ## 五、最佳实践与避坑指南 1. **避免原始类型** 使用`List<String>`而非`List`,否则丧失类型检查 2. **谨慎使用通配符** 避免过度使用`<?>`导致编译错误 3. **泛型与继承** `List<String>`不是`List<Object>`的子类型 4. **序列化问题** 泛型类需实现`Serializable`接口 ## 六、总结 Java泛型通过类型参数化和擦除机制,在保证向下兼容的同时提升了代码安全性和复用性。掌握泛型通配符、PECS原则及类型擦除原理,能显著提升代码质量。建议开发者在集合操作、工具类开发等场景中优先使用泛型,同时注意规避常见陷阱[11]()[12]()。 > **推荐阅读**: > - [Java泛型类型擦除原理](https://blog.csdn.net/caihuangshi/article/details/51278793) > - [泛型通配符深度解析](https://www.cnblogs.com/lwbqqyumidi/p/3837629.html)