【问题标题】:Arrays.asList return type mismatch confusion [duplicate]Arrays.asList 返回类型不匹配混淆[重复]
【发布时间】:2013-06-04 18:19:40
【问题描述】:

为什么以下不返回整数列表?

int[] ints = new int[] { 1, 2, 3, 4, 5 };
List<Integer> intsList = Arrays.asList(ints); //compilation error

而是int[]的列表

此时

String[] strings = new String[] { "Hello", "World" };
List<String> stringsList = Arrays.asList(strings);

返回String 的列表。我猜它失败是因为它是一组原语,但为什么呢?以及如何实际返回int 的列表。

【问题讨论】:

  • Object 只能包含在 List 中。这排除了 int 列表。
  • 我希望它会自动装箱。
  • 但是 List 给他一个编译错误。
  • 另一个问题的答案很好,这可能已关闭,不知道要搜索的正确术语。
  • Java 不会自动装箱数组,它只会自动装箱单个基元。

标签: java collections


【解决方案1】:

这是因为Arrays.asList(new int[] { 1, 2, 3, 4, 5 }) 将创建一个包含一个项目的List&lt;int[]&gt;,而不是一个包含五个项目的List&lt;Integer&gt;

但是请注意,这会达到您的预期:

List<Integer> intsList = Arrays.asList(1, 2, 3, 4, 5);

您的其他选择是:

  • 首先创建一个Integer[],或者
  • 循环填充您的列表

【讨论】:

  • 是的,我已经尝试过了,它确实有效,但 int[] 的大小为百万?
  • @arynaq 您的两个选择是创建Integer[] 而不是int[],或者循环填充您的列表。
【解决方案2】:

方法定义为: public static &lt;T&gt; List&lt;T&gt; asList(T... a)

所以在您的第一种情况下,Tint[],并且您将单个对象传递给方法(即数组),因此它返回 int[] 的列表。

我认为您误认为 asList(1, 2, 3, 4, 5)(即 5 项)

【讨论】:

  • 完全正确。 +1 记住。在 Java 中,如果您愿意,您可以使用类型为 T 的数组和类型为 T 的数组的可变数量的参数来调用方法。这就是签名很重要的原因。
  • Java 中没有 Listint 这样的东西。
【解决方案3】:

List&lt;T&gt; 中的T 必须是java.lang.Object 的某个子类型,而int 不是。唯一的其他解释是,当我们使用... 时,您提供了int[] 的数组,即int[][]。所以你会得到List&lt;int[]&gt;

StringObject 的子类型,因此可以按预期工作。这也是在 J2SE 5.0 中引入可变参数之前它可以工作的唯一方法。一般来说,现有代码的解释不应在语言版本之间改变。

现在,如果您想要一个List&lt;Integer&gt;,您可以检查并装箱每个整数。如果你的程序中有很多这些元素,那么内存可能是个问题。您可能希望使用一个第三方库,该库紧凑地支持 List&lt;Integer&gt;int[],或者只坚持使用数组作为基元。很遗憾,Java 不支持值类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 2017-08-10
    • 2016-10-25
    相关资源
    最近更新 更多