Java泛型与C++模板有何不同?为什么我不能使用int作为参数?

2022-08-31 16:19:39

我正在尝试创建

ArrayList<int> myList = new ArrayList<int>();

在Java中,但这不起作用。

有人可以解释为什么因为类型参数不起作用吗?
使用类进行原始工作,但有人可以解释为什么不被接受吗?intIntegerintint

Java 版本 1.6


答案 1

Java泛型与C++模板非常不同,因此我不打算在这里列出差异。(有关更多详细信息,请参阅C++和 Java 中的“泛型”类型之间的区别是什么?

在这种特殊情况下,问题在于不能使用基元作为泛型类型参数(请参阅 JLS §4.5.1:“类型参数可以是引用类型,也可以是通配符。

但是,由于自动装箱,您可以执行如下操作:

List<Integer> ints = new ArrayList<Integer>();
ints.add(3); // 3 is autoboxed into Integer.valueOf(3)

这样可以消除一些痛苦。不过,这肯定会损害运行时效率。


答案 2

不起作用的原因是,在 Java 中不能使用基元类型作为泛型参数。int

至于你的实际问题,C++模板与Java泛型有何不同,答案是它们真的非常非常不同。这些语言基本上应用完全不同的方法来实现类似的最终效果。

Java倾向于关注泛型的定义。也就是说,通过仅考虑泛型中的代码来检查泛型定义的有效性。如果未正确约束参数,则无法对它们执行某些操作。不考虑最终调用它的实际类型。

C++恰恰相反。仅对模板本身进行最低限度的验证。它实际上只需要可解析即可被认为是有效的。定义的实际正确性是在使用模板的位置完成的。


推荐