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

相关推荐
郝学胜-神的一滴6 小时前
Linux下创建线程:从入门到实践
linux·服务器·开发语言·c++·程序人生·软件工程
山土成旧客6 小时前
【Python学习打卡-Day22】启航Kaggle:从路径管理到独立项目研究的全方位指南
开发语言·python·学习
我命由我123456 小时前
Python Flask 开发 - Flask 路径参数类型(string、int、float、path、uuid)
服务器·开发语言·后端·python·flask·学习方法·python3.11
永远都不秃头的程序员(互关)6 小时前
C++核心语法复盘:数据结构编程的底层基石
开发语言
阿杆.6 小时前
如何在 Spring Boot 中接入 Amazon ElastiCache
java·spring boot·后端
别惹CC6 小时前
Spring AI 进阶之路04:集成 SearXNG 实现联网搜索
java·后端·spring
invicinble6 小时前
springboot的日志体系
java·spring boot·后端
leiming66 小时前
C++ 01 函数模板
开发语言·c++·算法