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

相关推荐
帅气的你3 分钟前
Spring Boot 集成 AOP 实现日志记录与接口权限校验
java·spring boot
无限进步_22 分钟前
【数据结构&C语言】对称二叉树的递归之美:镜像世界的探索
c语言·开发语言·数据结构·c++·算法·github·visual studio
zhglhy23 分钟前
Spring Data Slice使用指南
java·spring
CSDN_RTKLIB34 分钟前
C++取模与取余
开发语言·c++
win x35 分钟前
Redis 主从复制
java·数据库·redis
星河耀银海1 小时前
C++开发入门——环境搭建与第一个程序
开发语言·c++·策略模式
weixin_423995001 小时前
unity 处理图片:截图,下载,保存
java·unity·游戏引擎
还不秃顶的计科生1 小时前
defaultdict讲解
开发语言·javascript·ecmascript
帅气的你1 小时前
从零封装一个通用的 API 接口返回类:统一前后端交互格式
java·设计模式
qq_178057071 小时前
基于minio实现的分片上传-支持断点续传
java