《Effective Java》解读第26条:请不要使用原生态类型

第26条:请不要使用原生态类型

避免使用原生态类型(raw type),优先使用泛型(generic type)。

什么是原生态类型?

指不带任何实际类型参数的泛型类或接口,例如直接使用 List 而不是 List。这是为了兼容旧版本Java(JDK 5之前)而保留的语法。

原生类型缺点

  1. 失去类型安全性:编译器无法进行类型检查,容易在运行时抛出 ClassCastException。
  2. 掩盖潜在错误:编译时不会警告,问题可能延迟到运行时才发现。
  3. 背离泛型的设计初衷:泛型的核心价值就是在编译期捕获类型错误。

使用危险的原生类型:

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"运行时报错
        }

正确使用泛型:

编译时就错误,同时获取时无需强制转换。

少数可用情况

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

正确使用方式

  1. 知道具体类型:用参数化类型
java 复制代码
// ✅ 知道元素是String
List<String> strings = new ArrayList<>();

// ✅ 知道键值类型
Map<String, Integer> wordCounts = new HashMap<>();
  1. 不知道/不关心类型:用通配符类型
java 复制代码
// ✅ 安全的不确定类型
List<?> unknownList = getSomeList();
Object obj = unknownList.get(0);  // 安全读取为Object
// unknownList.add("x");          // ❌ 编译错误(保护性限制)

// ✅ 通配符比原生态类型安全的原因:
// - 不能随意添加元素(防止污染)
// - 明确表达"类型未知"的意图

请将使用原生态类型视为与使用 goto 语句同等严重的代码异味,除非在极少数兼容性场景下,否则绝不在新代码中使用。

相关推荐
小羊没烦恼!1 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里1 天前
java中的继承和多态的区别
java
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕1 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码1 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖1 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时1 天前
01-06-A-JVM排查实战详解
java·jvm
伞伞悦读1 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
vipxieliang1 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
C语言小火车1 天前
C/C++ 为什么需要编译器?
开发语言·c++