Integer包装类构造方法出现意外类型编译错误求助
问题根源分析
嘿,我一眼就看出问题出在哪了——你把泛型参数的名字起成Integer,这直接和Java自带的java.lang.Integer包装类撞名啦!
在你的BeanBag<Integer>类定义里,这个<Integer>是泛型类型参数(相当于一个占位符),在类内部所有的Integer都会被编译器当作这个占位符,而不是我们熟悉的那个包装类。所以当你写new Integer(rand)的时候,编译器以为你要实例化这个泛型参数,但泛型参数在编译时会被类型擦除,根本没法直接用new实例化,这就导致了“意外类型”的错误。
修复方案
方案一:去掉不必要的泛型(最适合你的场景)
因为你的类本来就是要存储java.lang.Integer类型的元素,完全没必要自己定义泛型参数,直接继承ArrayList<Integer>就行,代码还能简化不少:
import java.util.ArrayList; import java.util.Random; public class BeanBag extends ArrayList<Integer> { public BeanBag(int numBeans) { super(numBeans); Random fillBag = new Random(); for(int counter = 0; counter < numBeans; counter++) { int rand = fillBag.nextInt(2); // 利用Java自动装箱特性,直接把int转成Integer super.add(rand); } } }
方案二:保留泛型但避免命名冲突(适合未来扩展)
如果你想让BeanBag以后能支持其他类型,把泛型参数名改成常规的无冲突名字(比如E,这是集合类泛型的常用命名),同时调整元素生成逻辑(泛型参数不能直接new,需要通过元素生成器来创建实例):
import java.util.ArrayList; import java.util.Random; import java.util.function.Supplier; public class BeanBag<E> extends ArrayList<E> { // 通过Supplier传入元素生成逻辑 public BeanBag(int numBeans, Supplier<E> elementSupplier) { super(numBeans); for(int counter = 0; counter < numBeans; counter++) { super.add(elementSupplier.get()); } } // 专门生成Integer类型BeanBag的静态工厂方法 public static BeanBag<Integer> createIntegerBeanBag(int numBeans) { Random rand = new Random(); return new BeanBag<>(numBeans, () -> rand.nextInt(2)); } }
小提醒
以后定义泛型参数时,尽量用行业通用的命名:E(元素)、T(类型)、K(键)、V(值),避免和Java自带的类名重名,就能避免这种混淆问题啦!
内容的提问来源于stack exchange,提问作者Hayden
相关产品推荐
相关产品推荐

