java泛型不支持基本数据类型,必须用包装类,因类型擦除后只保留object,而基本类型非对象且不继承object;包装类是引用类型,支持集合、null及方法调用。

为什么必须用包装类
泛型底层是类型擦除,运行时只保留 Object 类型。而基本类型不是对象,也不继承自 Object,无法参与泛型机制。包装类是真正的引用类型,能放进集合、作为泛型参数、支持 null 值,也具备方法调用能力。
常见用法示例
-
集合中存储基本类型值:
List<integer> nums = new ArrayList();</integer>nums.add(100); // 自动装箱int x = nums.get(0); // 自动拆箱 -
自定义泛型类中使用:
public class Box<t> { private T value; public void set(T value) { this.value = value; } public T get() { return value; } }</t>只能传入Box<integer></integer>、Box<double></double>等,不能用Box<int></int> -
泛型方法参数和返回值:
public static <t extends number> double sum(T a, T b) { return a.doubleValue() + b.doubleValue(); }</t>调用时可传sum(new Integer(5), new Double(3.2)),因为 Integer 和 Double 都继承自 Number
要注意的细节
-
空指针风险:包装类变量可为
null,自动拆箱时若值为 null,会抛NullPointerException。例如:Integer i = null; int j = i;运行时报错。 -
== 比较陷阱:两个
Integer用 == 判断,小范围值(-128 到 127)可能因缓存返回 true,超出范围则比较的是对象地址,结果为 false。建议用equals()或先确保非 null 后用intValue()比较。 -
优先用 valueOf() 而非 new:如
Integer.valueOf(42)会复用缓存对象,new Integer(42)总是新建实例,效率低且破坏缓存语义。
字符串与包装类之间的转换
泛型本身不直接处理字符串,但在实际业务中常需转换:
- 字符串转包装类:
Integer.parseInt("123")返回 int,再自动装箱为Integer;或直接Integer.valueOf("123") - 包装类转字符串:
String s = myInt.toString();或String.valueOf(myInt) - 注意异常:
parseInt和valueOf遇非法字符串会抛NumberFormatException,需 try-catch










