为什么ArrayList的类型不能是'int'?

45
我想声明一个类型为intArrayList
为什么以下代码会报错:
ArrayList<int> list1 = new ArrayList<int>();

但是以下内容可以正常工作:
ArrayList<Integer> list1 = new ArrayList<Integer>();

?


4
因为int在同一上下文中不是一个对象,而Integer是。 - MadProgrammer
1
如果您想要包装int[],可以使用TIntArrayList - Peter Lawrey
int is primitive datatype we can use wrapper class in ArrayList - SF..MJ
7个回答

41

ArrayList只能引用类型,而不能引用基本类型。 Integer 是一个类,而不是一个基本类型。

当你声明ArrayList<Integer> list1 = new ArrayList<Integer>()时,你创建的是一个存储Integer类型而非int基本类型的ArrayList

如果您想了解基本类型和引用类型之间的区别,请查看http://pages.cs.wisc.edu/~hasti/cs302/examples/primitiveVsRef.html


1
你可能不需要在 new 表达式的右侧使用 <Integer> 类型参数。 ArrayList<Integer> list1=new ArrayList(); 也可以工作。 - Sartaj Singh Gill

14
因为int是一种原始类型。只有引用类型可以作为泛型参数使用。

即使在泛型出现之前(Java 5之前),这个限制就已经存在了,所以我不认为这是唯一的原因。 - Aravind Yarram
@Pangea:当然,你不能执行new ArrayList().add(5)。但是OP询问的是与该行代码相关的错误。 - Oliver Charlesworth
@OliCharlesworth,你实际上可以这样做。只需添加一个Integer而不是int值即可。 - Peter Lawrey
@PeterLawrey:啊,你说得对。我猜这在自动装箱之前是不起作用的? - Oliver Charlesworth

12
简短的回答是泛型(例如ArrayList<Integer>)不接受原始类型(int),只接受对象(Integer)。
这是因为像ArrayList这样的类是使用对象实现的。由于每个类都继承自Object,编译器可以插入其他类。但是原始类型(如int)不继承自Object,因为它们不是类。因此,Sun / Oracle创建了Integer类来解决这个问题。
简而言之:int不是Object

1
这是最佳答案,因为它解释了这个声明,它可以正常工作:ArrayList<int[]> - Hamman Samuel

1

以上所有答案都回答了为什么,但这个问题的根源是频繁的原始数据类型自动装箱和拆箱。这个问题已经通过IntBuffer或ChadBuffer解决,或者你可以在nio文件夹中找到所需的原始类型。下次如果您想使用原始ArrayList,请不要使用List,而是使用IntBuffer。


0

int 是一个 原始类型,它不是一个 对象

请参考这个链接了解更多细节。


1
在StackOverflow上,不鼓励仅提供链接的回答。 - Zach Latta

0

int是一种原始数据类型,但Integer是一个类,因此arrayList数组只能采用引用类型作为其参数,而不能采用原始类型。


0

int不是一个对象,因此如果列表类型为int,则无法实现列表的实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接