在做简单的程序时,我注意到了这个问题。
int[] example = new int[10];
List<Integer> exampleList = Arrays.asList(example);// Compilation error here
编译错误以cannot convert from List<int[]> to List<Integer>
的形式返回。但是java中不允许使用List<int>
,为什么会出现这种编译错误?
我不是在质疑autoboxing,我只是想知道Arrays.asList
如何返回List<int[]>
。
asList实现是
public static <T> List<T> asList(T... a) {
return new ArrayList<T>(a);
}
所以它将int []视为T就是为什么会发生这种情况。
答案 0 :(得分:12)
Arrays.asList
中没有对底层整数进行自动自动装箱。
int[]
实际上是一个对象,而不是一个原始对象。
此处Arrays.asList(example)
返回List<int[]>
。 List<int>
确实是无效的语法。
您可以使用:
列表与LT;整数&GT; exampleList = Arrays.asList(ArrayUtils.toObject(array));
使用Apache Commons ArrayUtils
。
答案 1 :(得分:2)
Arrays.asList(...)
完美地将一组对象转换为这些对象的列表。
此外,Arrays.asList(...)
在Java 5中使用varag构造定义,或者按顺序说,它可以接受未定义数量的参数,在这种情况下,它会将所有这些参数视为数组的成员,然后返回包含这些元素的List
实例。
List<Object> objList = Arrays.asList(obj1, obj2, obj3);
这意味着您可以使用单个元素创建列表:
List<Object> objList = Arrays.asList(obj1);
由于Java中不允许使用List<int>
,因此当您使用int[]
数组作为Arrays.asList
的参数时,它会将其视为列表的单个元素而不是{的数组{1}}。那是因为数组本身是Java中的对象,而int
(和任何其他原语)不是。
因此,在转换基元数组时,int
将尝试返回基本数组列表:
Arrays.asList
答案 2 :(得分:2)
签名<T> List<T> asList(T... os)
涉及通用类型T
。泛型类型的范围仅涵盖引用类型(包括数组类型),但不包括基本类型。因此,在Arrays.asList(ints)
int[] ints
的{{1}}调用中,T
只能解析为int[]
。
在更高级别,Arrays.asList
的目的是提供数组的列表视图。这意味着数组保持不变,其元素通过实现List
的对象可用。但是,List
只能包含对象,而您的数组包含原始int
s。这使得数组无法通过List
接口公开。
无论如何,如果您正在寻找优雅的语法来创建Integers
列表,请写Arrays.asList(1,2,3)
。
答案 3 :(得分:1)
数组是java中的对象,而不是基本类型。请注意,它显示List<int[]>
(int-arrays列表),而不是List<int>
。