《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 语句同等严重的代码异味,除非在极少数兼容性场景下,否则绝不在新代码中使用。

相关推荐
用头发抵命19 小时前
Vue 3 中优雅地集成 Video.js 播放器:从组件封装到功能定制
开发语言·javascript·ecmascript
似水明俊德19 小时前
02-C#.Net-反射-学习笔记
开发语言·笔记·学习·c#·.net
于先生吖20 小时前
Java框架开发短剧漫剧系统:后台管理与接口开发
java·开发语言
khddvbe20 小时前
C++并发编程中的死锁避免
开发语言·c++·算法
daidaidaiyu20 小时前
Spring IOC 源码学习 声明式事务的入口点
java·spring
myloveasuka21 小时前
[Java]查找算法&排序算法
java·算法·排序算法
清水白石00821 小时前
Free-Threaded Python 实战指南:机遇、风险与 PoC 验证方案
java·python·算法
wWYy.21 小时前
STL:list
开发语言·c++
TON_G-T21 小时前
day.js和 Moment.js
开发语言·javascript·ecmascript
发际线还在21 小时前
互联网大厂Java三轮面试全流程实战问答与解析
java·数据库·分布式·面试·并发·系统设计·大厂