tux*_*dna 21 java arrays generics collections
我看到了一个问题:从数组中创建ArrayList
但是,当我使用以下代码尝试该解决方案时,它并不适用于所有情况:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?代码不应该intList = new ArrayList<Integer>(Arrays.asList(intArray));编译得很好吗?
Lui*_*oza 29
问题在于
intList = new ArrayList<Integer>(Arrays.asList(intArray));
Run Code Online (Sandbox Code Playgroud)
因为原始数组从中扩展,所以它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));
Run Code Online (Sandbox Code Playgroud)
从您的注释:如果您仍想使用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));
Run Code Online (Sandbox Code Playgroud)
但由于你已经在使用for循环,我不介意使用临时包装类数组,只需将你的项目直接添加到列表中:
int[] intArray = new int[] { 0, 1 };
intList = new ArrayList<Integer>();
for(int intValue : intArray) {
intList.add(intValue);
}
Run Code Online (Sandbox Code Playgroud)
小智 10
使用Java 8,您可以在一行中完成:
int[] intArr = { 1, 1, 2, 3, 5, 8, 11};
List<Integer> list = Arrays.stream(intArr).boxed().collect(Collectors.toList());
list.forEach(System.out::println);
小智 7
它不起作用,因为你使用的是int[]而不是Integer[].试试这个:
Integer[] intArray = new Integer[] { 0, 1 };
// this should work now
intList = new ArrayList<Integer>(Arrays.asList(intArray));
Run Code Online (Sandbox Code Playgroud)
问题是关于Autoboxing.Java会自动转换int为自动转换Integer,但不会转换int[]为Integer[].因此原因.
public static <T> List<T> asList(T... a)
Run Code Online (Sandbox Code Playgroud)
asList定义如上.它期待一种类型的vararg T.即它可以采用类型的对象数组T.你的情况因为Java不能转换int[]到Integer[],因此它需要输入T的int[],而不是Integer根据需要.因此,您将获得一个类型列表List<int[].您必须手动将其转换`Integer[]为int[]
Effective JavaJoshua Bloch在书中有一个很好的项目,他用varargs解释了坑,这就是其中之一.
| 归档时间: |
|
| 查看次数: |
92956 次 |
| 最近记录: |