我看过这个问题:Create ArrayList from array
但是,当我使用以下代码尝试该解决方案时,并不是在所有情况下都能正常工作:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class ToArrayList {
public static void main(String[] args) {
// this works
String[] elements = new String[] { "Ryan", "Julie", "Bob" };
List<String> list = new ArrayList<String>(Arrays.asList(elements));
System.out.println(list);
// this works
List<Integer> intList = null;
intList = Arrays.asList(3, 5);
System.out.println(intList);
int[] intArray = new int[] { 0, 1 };
// this doesn't work!
intList = new ArrayList<Integer>(Arrays.asList(intArray));
System.out.println(intList);
}
}
我在这里做错了什么?难道代码intList = new ArrayList<Integer>(Arrays.asList(intArray));
不应该编译得很好吗?
发布于 2013-07-08 15:16:54
中的问题
intList = new ArrayList<Integer>(Arrays.asList(intArray));
将int[]
视为单个Object
实例,因为基本数组是从Object
扩展而来的。如果您使用Integer[]
而不是int[]
,这将会起作用,因为您现在正在发送一个Object
数组。
Integer[] intArray = new Integer[] { 0, 1 };
//now you're sending a Object array
intList = new ArrayList<Integer>(Arrays.asList(intArray));
如果您仍然希望使用int[]
(或另一个原始类型数组)作为主数据,则需要使用包装器类创建一个额外的数组。在此示例中:
int[] intArray = new int[] { 0, 1 };
Integer[] integerArray = new Integer[intArray.length];
int i = 0;
for(int intValue : intArray) {
integerArray[i++] = intValue;
}
intList = new ArrayList<Integer>(Arrays.asList(integerArray));
但是由于您已经在使用for
循环,所以我不介意使用临时包装器类数组,只需将您的项直接添加到列表中:
int[] intArray = new int[] { 0, 1 };
intList = new ArrayList<Integer>();
for(int intValue : intArray) {
intList.add(intValue);
}
发布于 2013-07-08 16:25:36
问题与自动装箱有关。Java会自动将int
转换为Integer
,但不会将int[]
转换为Integer[]
。这就是原因所在。
public static <T> List<T> asList(T... a)
asList
的定义如下所示。它需要一个T
类型的变量。也就是说,它可以接受T
类型的对象数组。在您的例子中,由于Java不能将int[]
转换为Integer[]
,因此它将T
类型作为int[]
而不是Integer
。因此,您会得到一个类型为List<int[]
的列表。您必须手动将其从int[]
转换为`Integer[]
在Joshua Bloch的书Effective Java
中有一个很好的项目,他用varargs解释了坑,这是其中之一。
发布于 2013-07-08 15:17:50
它不起作用,因为您使用的是int[]
而不是Integer[]
。试试这个:
Integer[] intArray = new Integer[] { 0, 1 };
// this should work now
intList = new ArrayList<Integer>(Arrays.asList(intArray));
https://stackoverflow.com/questions/17520964
复制相似问题