我正在参加「掘金·启航计划」,最近在开发过程中,有段代码需要将int[] 转换为 List ,但转换完之后取值时,一直报异常。代码大致如下:
int[] array = new int[]{42, 5, 1, 3, 4};
List<Integer> list = new ArrayList(Arrays.asList(array));
System.out.println(list.get(0));
你认为会打印什么??你以为会将42打印出来吗?实际上,会打印类似的东西:
[I@2ff4acd0
那么,问题在哪里?首先,让我们看看IDE显示的警告:
Raw use of parameterized class 'ArrayList'
Call to 'asList()' with only one argument
可以看到有两个警告:第一个警告的意思是使用了泛型类 ArrayList 但没有指定类型参数,这会导致安全性问题。我们应该使用 ArrayList 而不是简单的 ArrayList 来指定类型参数。第二个警告是我们调用了 Arrays.asList() 方法,但只传递了一个参数。Arrays.asList() 实际上期望接收多个参数来创建列表,但我们只传递了一个数组。我们先来解决第一个警告 ,在ArrayList后面加上泛型:
int[] array = new int[]{42, 5, 1, 3, 4};
List<Integer> list = new ArrayList<>(Arrays.asList(array));
System.out.println(list.get(0));
但加上之后编译报错,提示如下信息:
Required type: List<Integer>
Provided: ArrayList<int[]>
看起来它与我们之前看到的第二个警告相符。原因是Arrays.asList(array)
不会将int
装箱为Integer
,而是创建一个<int[]>
的List
,而不是我们想要的Integer
的List
。有几种方法可以解决这个问题:
1、array
的类型可以从int[]
改为Integer[]
:
Integer[] array = new Integer[]{42, 5, 1, 3, 4};
List<Integer> list = new ArrayList<>(Arrays.asList(array));
System.out.println(list.get(0));
2、使用装箱的IntStream
可以将array
转换为List<Integer>
:
int[] array = new int[]{42, 5, 1, 3, 4};
List<Integer> list = new ArrayList<>(Arrays.stream(array).boxed().toList());
System.out.println(list.get(0));
3、从int[]
创建IntStream
的另一种方法是使用IntStream.of()
:
int[] array = new int[]{42, 5, 1, 3, 4};
List<Integer> list = new ArrayList<>(IntStream.of(array).boxed().toList());
System.out.println(list.get(0));
三种修复方法都可以将代码将打印42
。所以,在idea提示代码警告时,不要不当回事,有时候真的会发生一些难以预料的bug。
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END