无法向 ArrayList 添加整数

我创建了一个ArrayList:

import java.util.Scanner; import java.util.ArrayList; import java.util.Collections; import java.util.Arrays; class Main{ static ArrayList fibo_list=new ArrayList(); static int current_index; public static void main(String args[]){ fibo_list.add(0); fibo_list.add(1); fibo_list.add(1); 

三个fibo_list.add()抛出相同类型的错误。 这是第一个:

 error: no suitable method found for add(int) fibo_list.add(0); ^ method ArrayList.add(int,Long) is not applicable (actual and formal argument lists differ in length) method ArrayList.add(Long) is not applicable (actual argument int cannot be converted to Long by method invocation conversion) method AbstractList.add(int,Long) is not applicable (actual and formal argument lists differ in length) method AbstractList.add(Long) is not applicable (actual argument int cannot be converted to Long by method invocation conversion) method AbstractCollection.add(Long) is not applicable (actual argument int cannot be converted to Long by method invocation conversion) 

现在它的工作原理如下:

 fibo_list.add((long)0); fibo_list.add((long)1); fibo_list.add((long)1); 

但为什么它没有隐含地投下自己?

当您尝试以下代码时:

 fibo_list.add(0); fibo_list.add(1); fibo_list.add(1); 

您正在尝试将原始整数值添加到Long对象的集合中。 这不起作用,也不会装箱这些值,这将产生一个Integer 。 这也失败了,因为Integer不能存储在Long的集合中。 但是,以下代码将起作用:

 fibo_list.add(0L); fibo_list.add(1L); fibo_list.add(1L); 

在这里,我们传递原始的long值,然后可以将其装箱为Long

你在铸造和拳击之间感到困惑。

当int转换为Integer时 – 它被称为boxing和revrese进程称为unboxing。

JAVA支持自动装箱,这意味着你的原语会在需要时自动转换为它的包装类,反之亦然。 例如int – > Integer,long – > Long等。

Java还支持在基元之间进行转换,这意味着int基元可以隐式地转换为长基元。

您要实现的目标是上述操作的组合。 您希望将int转换为Long,这将需要2个步骤,这可以通过2种不同的方式实现(让我们假设有一段时间可能):

方式1:

  1. 将int转换为long
  2. 拳击长到长

方式2:

  1. boxing int to Integer
  2. 将整数转换为Long

由于没有明确选择的方式,因此JAVA不允许任何2步骤过程作为自动转换。

这里需要应用装箱转换,因为列表包含盒装基元,而不是基元。

JLS Sec 5.1.7中描述了此转换:

拳击转换将基本类型的表达式转换为引用类型的相应表达式。 具体来说,以下九个转换称为装箱转换:

  • 从int类型到Integer类型
  • 从类型long到类型Long

但是没有拳击转换“从int到类型Long”。 因此,无法应用此方法调用,因此它是编译器错误。

使用Long.valueOf(intValue)显式转换为long ,显式框(其中扩展转换将int参数转换为long ),或者在文字上使用L后缀。