List<> 等泛型集合类要求填充的必须是引用类型(对象类型),而不能直接使用基本数据类型(如 int、char、double 等),否则会编译报错。
这是因为 Java 的泛型机制在设计时就只支持引用类型,不支持基本数据类型。例如,下面的代码会报错:
// 错误示例:List 中直接使用基本数据类型 int
List<int> list = new ArrayList<>(); // 编译报错解决的办法是,使用基本数据类型对应的包装类。因此,正确的写法是:
// 正确示例:使用包装类 Integer
List<Integer> list = new ArrayList<>();
list.add(10); // 自动装箱:int -> Integer
int num = list.get(0); // 自动拆箱:Integer -> int这么设计的原因是:
- 泛型的类型擦除机制:Java 泛型在编译后会被擦除为
Object类型,而Object只能接收引用类型,不能接收基本数据类型。 - 历史原因:Java 最初设计时基本数据类型和引用类型是严格区分的,泛型是后期(JDK 1.5)才引入的特性,为了兼容已有的类型系统,选择只支持引用类型。
通过使用包装类,结合 Java 的自动装箱(基本类型 → 包装类)和自动拆箱(包装类 → 基本类型)机制,可以很方便地在泛型集合中操作基本数据类型的数据。
int 和 Integer > 二、`Integer b = 10;` 背后到底发生了什么(自动装箱和拆箱)