Java 泛型是对语言类型系统的扩展,允许类和方法按类型参数化。你可以把类型参数看作占位符,就像方法的形式参数是运行时值的占位符一样。
集合框架最能体现泛型的价值。比如 Map 类原本允许添加任意对象,最常见的是保存特定类型的值(如 String)。但 Map.get() 返回 Object,通常必须强制转换:
Map m = new HashMap();
m.put("key", "blarg");
String s = (String) m.get("key");
编译能通过不代表安全。如果映射里存了非 String 对象,运行时会抛出 ClassCastException。理想情况下,我们希望明确 m 是 String 键到 String 值的映射。这就是泛型的作用——消除强转,增加类型检查层。
泛型带来的好处
引入泛型是 Java 的重大增强,不仅语言层面,类库(如集合)也全面重构。
1. 类型安全 泛型的主要目标是提高类型安全。编译器能验证类型假设,错误在编译期就被捕获,而不是等到运行时变成异常。这大大提升了程序的可靠性。
2. 消除强制类型转换 看下面两个例子对比:
不使用泛型:
List li = new ArrayList();
li.put(new Integer(3));
Integer i = (Integer) li.get(0);
使用泛型:
List<Integer> li = new ArrayList<>();
li.put(new Integer(3));
Integer i = li.get(0);
虽然声明时多写了点代码,但在大型项目中,累积减少的强转能让代码更简洁、可读性更高。
3. 潜在性能收益 早期实现中,编译器会插入隐式强转。随着 JVM 优化,更多类型信息可能带来更好的性能。目前所有工作主要在编译器完成,生成类似无泛型的字节码,但更安全。

