Arrays.asList()不能正常工作?

Sav*_*sis 54 java arrays list variadic-functions

我有一个float [],我想得到一个具有相同元素的列表.我可以做一个又一个添加它们的丑陋的事情,但我想使用Arrays.asList方法.但是有一个问题.这有效:

List<Integer> list = Arrays.asList(1,2,3,4,5);
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.

int[] ints = new int[] {1,2,3,4,5};
List<Integer> list = Arrays.asList(ints);
Run Code Online (Sandbox Code Playgroud)

asList方法接受一个varargs参数,对我来说,扩展是一个数组的"简写".

问题:

  • 为什么第二段代码返回List<int[]>但不返回List<int>.

  • 有没有办法纠正它?

  • 为什么自动装箱不在这里工作; 即int[]Integer[]

Jon*_*eet 74

List<int>在Java中没有这样的东西- 泛型不支持原语.

自动装箱只发生在单个元素上,而不是基元数组.

至于如何纠正它 - 有各种各样的库,有很多方法可以做这样的事情.没有办法围绕这个,我认为在JDK中没有任何东西可以让它变得更容易.有些人会包裹在包装类型(让拳击发生在接入),其他人将通过独创的阵列,因为他们去重复,以创建一个独立的副本,装箱清单的基本数组.确保您知道自己在使用哪个.

(编辑:我一直认为一个人的起点int[]是不可谈判的.如果你可以从一个开始Integer[]那么你很好:)

仅举一个辅助库的例子,并插入一点Guava,就是这样com.google.common.primitive.Ints.asList.

  • @Geek:那么你会建议什么呢?通过复制所有元素将`double []`自动转换为`Double []`会很奇怪 - 这样引用类型的强制转换将有效地克隆数据,这与Java中的其他所有操作不同.如果你建议`Double []`应该能够以"视图"的方式由`double []`支持,那么还有其他问题,例如如何存储空引用以及它们之间的区别这个和其他数组.我认为这是正确的决定. (4认同)

JRL*_*JRL 30

这个怎么样?

Integer[] ints = new Integer[] {1,2,3,4,5};
List<Integer> list = Arrays.asList(ints);
Run Code Online (Sandbox Code Playgroud)

  • 难以置信......它适用于参考但不适用于原始类型:D非常感谢.:) (7认同)
  • 嗯但有一种简单的方法将int []转换为Integer []?事情是我通过方法调用得到我的数组,我无法改变它. (7认同)
  • 打败我,但解释也会更好. (6认同)

Chs*_*y76 15

因为java数组是对象,Arrays.asList()并将您的int数组视为varargs列表中的单个参数.

  • @mmyers事实上,这就是这个问题的全部意义所在.ChssPly76的+1 (4认同)

YoY*_*oYo 13

输入Java 8,您可以执行以下操作来收集盒装数组:

Integer[] boxedInts = IntStream.of(ints).boxed().toArray(Integer[]::new);
Run Code Online (Sandbox Code Playgroud)

或者这个收集在盒装列表中

List<Integer> boxedInts = IntStream.of(ints).boxed().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

然而,这仅适用于int[],long[]double[].这不适用byte[].

请注意Arrays.stream(ints)并且IntStream.of(ints)是等效的.所以前面的两个例子也可以改写为:

Integer[] boxedIntArray = Arrays.stream(ints).boxed().toArray(Integer[]::new);
List<Integer> boxedIntList = Arrays.stream(ints).boxed().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

最后一种形式可能是有利的,因为它省略了原始的特定子类型Stream.但是,在内部它仍然是一堆重载的,在这种情况下仍然在IntStream内部创建.


Mic*_*rdt 5

问题不在于Arrays.asList()。问题是您希望自动装箱能够在阵列上工作,但事实并非如此。在第一种情况下,编译器在查看各个int用途之前将其自动装箱。在第二种情况下,您首先将它们放入一个int数组(无需自动装箱),然后将其传递给Arrays.asList()(不可能进行自动装箱)。