在 Java 中将 int 的原始数组转换为 ArrayList:“java.lang.ClassCastException:[我无法转换为 java.lang.Integer”
Posted
技术标签:
【中文标题】在 Java 中将 int 的原始数组转换为 ArrayList:“java.lang.ClassCastException:[我无法转换为 java.lang.Integer”【英文标题】:Converting primitive array of int into ArrayList in Java: "java.lang.ClassCastException: [I cannot be cast to java.lang.Integer" 【发布时间】:2021-02-03 20:42:59 【问题描述】:我想知道如何将原始整数数组转换为整数列表?
没有编译错误:
int[] nums = 0, 1;
List<Integer> list = new ArrayList(Arrays.asList(nums));
list.get(0);
但是这个:
int[] nums = 0, 1;
List<Integer> list = new ArrayList(Arrays.asList(nums));
int a = list.get(0);
失败:
java.lang.ClassCastException: class [I cannot be cast to class java.lang.Integer ([I and java.lang.Integer are in module java.base of loader 'bootstrap')
【问题讨论】:
int 和 Integer 不一样 请注意new ArrayList(
几乎自动成为一个错误;那是一个“raw type”,并告诉编译器忽略它对类型系统的了解。您应该改为写new ArrayList<>(
。这样你会在编译时得到一个适当的错误,让你知道你的类型不匹配,而不是在运行时ClassCastException
。
另外——你写的第一个例子“没有编译错误”,但实际上没有一个产生编译错误。
谢谢@ruakh!好点 :) 我 99% 同意你的观点。我可能是错的,但我认为当类型已经在List <Integer>
中定义时,在ArrayList<Ingeger>(
中添加<Integer>
是不必要的,ArrayList(
很好(或者甚至更好)。如果我错了,请纠正我。
@NavidVafaei:从 OP 的示例中可以看出,编译器允许类似 List<Integer> list = new ArrayList(Arrays.asList("string"))
的内容,即使它会在运行时引发异常。请注意,我不建议添加<Integer>
;我仅建议添加<>
,如List<Integer> list = new ArrayList<>(Arrays.asList("string"))
。 <>
要求编译器推断类型,因此它不是原始类型,并且在编译时而不是运行时检测到问题。
【参考方案1】:
解决方案 1:
在 Java 8 中:
List<Integer> list = Arrays.stream(nums).boxed().collect(Collectors.toCollection(ArrayList::new));
注意:您可能需要:
import java.util.stream.Collectors;
解决方案 2:
使用 for 循环:
List<Integer> list = new ArrayList();
for(int n : nums)
list.add(n);
解决方案 3:
将原始数组声明为Ingeger[]
而不是int[]
:
Integer[] nums = 0, 1;
【讨论】:
【参考方案2】:代码 Arrays.asList(nums)
不会转换为具有 2 个值的 ArrayList
,即。 1 和 2。它只有一个值,int[] 1, 2
。为了创建正确的ArrayList
,您应该使用
List<Integer> list = Arrays.stream(nums).boxed().collect(Collectors.toList());
【讨论】:
以上是关于在 Java 中将 int 的原始数组转换为 ArrayList:“java.lang.ClassCastException:[我无法转换为 java.lang.Integer”的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java 中将 Integer[] 转换为 int[] 数组?