Arrays.asList返回类型不匹配的混淆

时间:2013-06-04 18:19:40

标签: java collections

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

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列表。

3 个答案:

答案 0 :(得分:7)

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

但请注意,这可以达到预期目的:

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

您的其他选择是:

  • 首先创建Integer[],或
  • 以循环方式填充您的列表

答案 1 :(得分:3)

该方法定义为: public static <T> List<T> asList(T... a)

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

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

答案 2 :(得分:2)

T中的List<T>必须是java.lang.Object的某个子类型,int不是。只有其他解释是,正如我们使用...所提供的int[]数组,即int[][]。所以你得到List<int[]>

StringObject的子类型,因此按预期工作。也是在J2SE 5.0中引入varargs之前可以工作的唯一方法。通常,现有代码的解释不应在语言版本之间发生变化。

现在,如果你想要一个List<Integer>,你可以通过并选中每个整数。如果你的程序中有很多这些元素,那么内存可能是一个问题。您可能希望使用第三方库,该第三方库使用List<Integer>紧凑地备份int[],或者只使用基元数组。遗憾的是,Java不支持值类型。