【问题标题】:Java autoboxing and unboxing issue [duplicate]Java自动装箱和拆箱问题[重复]
【发布时间】:2018-06-20 17:53:51
【问题描述】:

Java 编译器负责转换原始数据类型及其包装类。但我的疑问是,尽管 Java 编译器自己执行类型转换,但为什么当我尝试将 Array 转换为 ArrayList 时它会打印错误以 int 数组为参数..Like:

int[] val = {1,2,3,4,5};
ArrayList<Integer> newval = new ArrayList<Integer>(Arrays.asList(val));

错误:找不到适合 ArrayList(List&lt;int[]&gt;) 的构造函数

为什么编译器不将 int 转换为 Integer?

【问题讨论】:

  • 没有将原始数组自动装箱为相应包装器类型的数组。
  • 使用Streamint 转换为Integer 然后收集所有我想是最简单的...
  • 自动装箱是 Java 编译器在原始类型和它们对应的对象包装类之间进行的自动转换。例如,将 int 转换为 Integer,将 double 转换为 Double,等等。如果转换以另一种方式进行,这称为拆箱,但不是数组格式的集合。

标签: java


【解决方案1】:
int[] val = {1,2,3,4,5};

对于原始数组:

List<int[]> vv = Arrays.asList(val); 

将获得数组列表,因为当我们尝试将原始数组转换为列表时自动装箱不起作用

对于对象数组类型:

Integer[] val = {1,2,3,4,5};
List<Integer> vv = Arrays.asList(val); 

编译器将使用自动装箱

【讨论】:

    【解决方案2】:

    您无法创建ArrayList&lt;primitive types&gt; 来源:why you can't create a Arraylist of primitive types。相反,使用适配器类:

    class Adapter{
    
    private int[] value;
    
    adapter(int[] value){
    
    this.value = value;
     }
     public int[] getValue(){
     return value;
       }
      }
    

    然后将其添加到ArrayList&lt;Adapter&gt; AL = new ArrayList&lt;&gt;();

    【讨论】:

    • 然后直接使用Integer...另外,一个类应该以大写开头;)
    • @AxelH 更改了适配器 -> 适配器。谢谢!我只是建议使用其他方法来处理集合中的原始类型。
    • 你会如何使用 Adapter 来代替 List&lt;Integer&gt; ?不知道这里的计划是什么......
    【解决方案3】:

    您可以使用IntStream 来帮助您对原语进行“装箱”

    int[] a = {1,2,3,4};
    List<Integer> list = IntStream.of(a)
            .boxed()
            .collect(Collectors.toList());
    

    这将迭代数组,将int 装箱为Integer,然后您只需将StreamCollectors 一起收集到List 中。

    【讨论】:

      【解决方案4】:

      这里没有自动装箱;也许你打算这样做:

      Integer[] val = {1,2,3,4,5};
      

      【讨论】:

      • 我猜数组初始化只是为了 MCVE ;) 但它可能就这么简单......
      【解决方案5】:

      Arrays.asList 接受一个对象数组——而不是原语(在许多情况下,编译器足够聪明,可以通过称为自动装箱的东西进行交换——在这种情况下不是)。使用一个简单的循环,您可以将数组的项目添加到List

      【讨论】:

      • 虽然您的解决方案是错误的,但我不明白为什么人们会反对。解释是正确的
      • @Midnight 以及不是解决方案的解决方案不属于......解释最多是评论。
      • @Midnightas 与此处的 AxelH 相同。
      • @AxelH 这个问题问的是“为什么”,而不是“如何解决这个问题”。因此答案是有效的。
      猜你喜欢
      • 2011-05-02
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多