【问题标题】:How Arrays.asList(int[]) can return List<int[]>?Arrays.asList(int[]) 如何返回 List<int[]>?
【发布时间】:2016-09-07 17:09:18
【问题描述】:

在做简单程序时,我注意到了这个问题。

int[] example = new int[10];
List<Integer> exampleList = Arrays.asList(example);// Compilation error here  

编译错误返回为cannot convert from List&lt;int[]&gt; to List&lt;Integer&gt;。但是List&lt;int&gt;在java中是不允许的,为什么会出现这种编译错误呢?

我不是在这里质疑自动装箱,我只是想知道Arrays.asList 如何返回List&lt;int[]&gt;

asList 实现是

public static <T> List<T> asList(T... a) {
return new ArrayList<T>(a);
}

因此它将 int[] 视为 T 这就是发生这种情况的原因。

【问题讨论】:

  • 您想知道Arrays.asList 如何返回List&lt;int&gt;,但您收到的错误消息清楚地表明您是List&lt;int[]&gt; 而不是List&lt;int&gt;

标签: java


【解决方案1】:

Arrays.asList 中的底层整数没有自动装箱。

  • int[] 实际上是一个对象,而不是原语。

  • 这里Arrays.asList(example) 返回List&lt;int[]&gt;List&lt;int&gt; 确实是无效语法。

  • 你可以使用:

    List exampleList = Arrays.asList(ArrayUtils.toObject(array));

    使用 Apache Commons ArrayUtils

【讨论】:

    【解决方案2】:

    Arrays.asList(...) 完美地将对象数组转换为这些对象的列表。

    此外,Arrays.asList(...) 在 Java 5 中使用 varag 构造定义,或者,换句话说,它可以接受未定义数量的参数,在这种情况下,它将所有这些参数视为数组的成员,然后返回包含这些元素的 List 实例。

    List<Object> objList = Arrays.asList(obj1, obj2, obj3);
    

    这意味着您可以创建一个包含单个元素的列表:

    List<Object> objList = Arrays.asList(obj1);
    

    由于 Java 中不允许使用 List&lt;int&gt;,因此当您使用 int[] 数组作为 Arrays.asList 的参数时,它会将其视为列表的单个元素,而不是 int 的数组。这是因为数组本身就是 Java 中的对象,而 int(和任何其他原语)不是。

    所以,当转换原始数组时,Arrays.asList 将尝试返回原始数组列表:

    List<int[]> intArrayList = Arrays.asList(new int[]{ 1, 2, 3 });
    

    【讨论】:

      【解决方案3】:

      签名&lt;T&gt; List&lt;T&gt; asList(T... os) 涉及一个泛型类型T。泛型类型的范围仅涵盖引用类型(包括数组类型),而不包括原始类型。因此,在 Arrays.asList(ints)int[] ints 的调用中,T 只能解析为 int[]

      在更高层次上,Arrays.asList 的目的是提供数组的列表视图。这意味着数组保持不变,其元素可通过实现List 的对象获得。但是,Lists 只能包含对象,而您的数组包含原始 ints。这使得该数组无法通过List 接口公开。

      无论如何,如果您正在寻找一种优雅的语法来创建Integers 的列表,请写Arrays.asList(1,2,3)

      【讨论】:

        【解决方案4】:

        数组是java中的对象,而不是原始类型。请注意,它说的是List&lt;int[]&gt;(整数数组列表),而不是List&lt;int&gt;

        【讨论】:

          猜你喜欢
          • 2011-07-01
          • 2016-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多