第26条:请不要使用原生态类型
避免使用原生态类型(raw type),优先使用泛型(generic type)。
什么是原生态类型?
指不带任何实际类型参数的泛型类或接口,例如直接使用 List 而不是 List。这是为了兼容旧版本Java(JDK 5之前)而保留的语法。
原生类型缺点
- 失去类型安全性:编译器无法进行类型检查,容易在运行时抛出 ClassCastException。
- 掩盖潜在错误:编译时不会警告,问题可能延迟到运行时才发现。
- 背离泛型的设计初衷:泛型的核心价值就是在编译期捕获类型错误。
使用危险的原生类型:
java
List list = new ArrayList();
// 均可正常添加
list.add(1);
list.add("2");
// 模拟使用时
for (Object o : list) {
Integer i = (Integer) o;
System.out.println(i); // 1正常,"2"运行时报错
}
正确使用泛型:
编译时就错误,同时获取时无需强制转换。

少数可用情况
- instanceof ,泛型运行时被擦除,instanceof 只能检查原生态类型。
- 类字面量(Class Literal):List.class 是合法的,但 List.class 不合法。

正确使用方式
- 知道具体类型:用参数化类型
java
// ✅ 知道元素是String
List<String> strings = new ArrayList<>();
// ✅ 知道键值类型
Map<String, Integer> wordCounts = new HashMap<>();
- 不知道/不关心类型:用通配符类型
java
// ✅ 安全的不确定类型
List<?> unknownList = getSomeList();
Object obj = unknownList.get(0); // 安全读取为Object
// unknownList.add("x"); // ❌ 编译错误(保护性限制)
// ✅ 通配符比原生态类型安全的原因:
// - 不能随意添加元素(防止污染)
// - 明确表达"类型未知"的意图
请将使用原生态类型视为与使用 goto 语句同等严重的代码异味,除非在极少数兼容性场景下,否则绝不在新代码中使用。