能否用Arrays.asList创建数组列表?为何Integer[]参数未被正确识别?
解决创建包含单个Integer[]元素的List问题
这个问题我之前也碰到过,确实容易踩坑!先给你解释下为什么会出现这种情况:
Arrays.asList()的参数是T...可变参数,本质上它接受的是一个数组。当你传入Integer[]的时候,Java编译器会优先把这个数组当成可变参数的参数列表(因为Integer[]可以向上转型为Object[]),所以它会把数组里的每个Integer元素拆出来,最终得到的是包含三个Integer的List<Integer>,而不是你想要的List<Integer[]>。
那怎么解决呢?给你几个实用的方案:
方案1:显式指定泛型类型
直接在调用asList的时候明确告诉编译器,我们要的泛型类型是Integer[],这样它就不会把传入的数组拆解开了:
Integer[] foo = {1, 2, 3}; List<Integer[]> list = Arrays.<Integer[]>asList(foo);
方案2:手动创建列表并添加元素(兼容性强)
不管你用哪个Java版本,这种方式都不会出错,逻辑也最直观:
Integer[] foo = {1, 2, 3}; List<Integer[]> list = new ArrayList<>(); list.add(foo);
如果是Java 9及以上版本,还可以用更简洁的List.of(),同样需要显式指定泛型:
List<Integer[]> list = List.<Integer[]>of(foo);
方案3:将数组包装成Object数组传入
另一种思路是把你的Integer[]放到一个Object[]里,让Arrays.asList()把这个Object[]里的元素(也就是你的Integer[])当成列表的单个元素:
List<Integer[]> list = (List<Integer[]>) Arrays.asList(new Object[]{foo});
不过这种方式需要强制类型转换,代码可读性差,一般不推荐使用。
总结一下,最推荐的是方案1或者方案2,代码清晰直观,也不容易踩新的坑。
内容的提问来源于stack exchange,提问作者user8931048
相关产品推荐
相关产品推荐

