【问题标题】:why does auto-boxing and unboxing of integers does not work with Arrays.asList in Java? [duplicate]为什么整数的自动装箱和拆箱不适用于 Java 中的 Arrays.asList? [复制]
【发布时间】:2014-01-21 15:13:24
【问题描述】:

以下是抛出compile error

int[] arrs = {1,2,4,3,5,6};
List<Integer> arry = Arrays.asList(arrs);

但这有效:

for (Integer i : arrs){
   //do something
}

自动装箱在许多情况下都有效,我只是在上面举了一个for-loop 的例子。但它在我在Arrays.asList() 中制作的List-view 中失败了。

为什么会失败,为什么选择这样的设计实现?

【问题讨论】:

  • 因为int[]Integer[] 没有自动装箱,并且该方法采用T[]

标签: java arrays list copy autoboxing


【解决方案1】:

Arrays.asList() 接受任意数量的给定类型 T (#asList(T.. t)) 的参数。调用Arrays.asList(arrs) 你真正做的是传递int[] 类型的单个元素因此问题。 它应该是:

int[] arrs = {1,2,4,3,5,6};
List&lt;int[]&gt; arry = Arrays.asList(arrs);

List&lt;Integer&gt; arry = Arrays.asList(1,2,3,4,5,6);

【讨论】:

    【解决方案2】:

    要使事情正常进行,您需要使用Integer[] 而不是int[]

    asList 的参数是T... 类型,而泛型类型T 不能表示基本类型int,因此它将表示最具体的Object 类,在这种情况下是数组类型int[]
    这就是为什么Arrays.asList(arrs); 会尝试返回List&lt;int[]&gt; 而不是List&lt;int&gt; 甚至List&lt;Integer&gt;

    有些人希望自动从int[] 转换为Integer[],但不要忘记自动装箱仅适用于原始类型,但数组不是原始类型。

    【讨论】:

    • 嘿,不错的编辑,现在的答案相同:)
    【解决方案3】:

    Arrays.asList 将通用 T[] 作为参数。这个T 始终是一个对象,而不是一个原语。当您将int[] 作为参数(不是对象数组而是原语)时,它会认为参数实际上是可变参数的第一个元素。所以结果列表将有指纹List&lt;int[]&gt;

    如果您想了解有关数组中泛型的更多信息,请阅读此页面: http://docs.oracle.com/javase/tutorial/extra/generics/fineprint.html(部分:数组)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      • 2018-06-20
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多