【问题标题】:Why can't I have 'int' as the type of an ArrayList?为什么我不能将 'int' 作为 ArrayList 的类型?
【发布时间】:2012-12-30 05:12:44
【问题描述】:

我想声明一个int 类型的ArrayList。

为什么以下给我一个错误:

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

但以下工作:

ArrayList<Integer> list1 = new ArrayList<Integer>();

?

【问题讨论】:

  • 因为int 与Integer 不是同一上下文中的对象
  • 如果你想要包裹int[]的东西,你可以使用TIntArrayList
  • int 是原始数据类型,我们可以在ArrayList 中使用包装类

标签: java arraylist integer


【解决方案1】:

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

【讨论】:

  • 甚至在泛型之前(在 Java 5 之前)这个限制就在那里,所以我认为这不是唯一的原因
  • @Pangea:当然,你不能这样做new ArrayList().add(5)。但是 OP 正在询问该特定代码行的错误...
  • @OliCharlesworth 实际上你可以做到。它只会添加 Integer 而不是 int 值。
  • @PeterLawrey:啊,你是对的。我猜这在自动装箱之前不起作用?
【解决方案2】:

int 是 primitive。这不是Object。

更多详情请参考link。

【讨论】:

  • StackOverflow 不鼓励仅链接答案。
【解决方案3】:

ArrayList 只能引用类型,不能引用原语。 Integer 是一个类,而不是原语。

当您声明 ArrayList&lt;Integer&gt; list1 = new ArrayList&lt;Integer&gt;() 时,您正在创建一个 ArrayList,它将存储 Integer 类型,而不是 int 原语。

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

【讨论】:

  • 您可能不需要新表达式右侧的 类型参数。 ArrayList&lt;Integer&gt; list1=new ArrayList(); 也可以。
【解决方案4】:

简短的回答是泛型(如ArrayList&lt;Integer&gt;)不接受原始类型(int),只接受对象(Integer)。

这是因为像ArrayList 这样的类是使用对象实现的。由于每个类都继承自 Object,因此编译器可以插入其他类。但是原始类型(如int)不继承自Object,因为它们不是类。因此,Sun/Oracle 制作了 Integer 类来帮助解决这个问题。

所以,简而言之:int 不是 Object。

【讨论】:

  • 这是最好的答案,因为它解释了这个声明,效果很好:ArrayList&lt;int[]&gt;
【解决方案5】:

int 是原始数据类型,而 Integer 是类,因此 arrayList 数组只能将引用类型作为其参数,而不是原始类型

【讨论】:

    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

      int 不是 Object,因此如果列表类型是 int,则无法完成列表的实现。

      【讨论】:

        猜你喜欢
        • 2022-01-26
        • 1970-01-01
        • 2011-11-20
        • 2016-05-14
        • 2016-03-07
        • 2020-09-17
        • 1970-01-01
        • 2014-01-15
        • 1970-01-01
        相关资源
        最近更新 更多