有一个ClassCastException,我不知道为什么不能将Object[]转换为String[]?
package day5;
import java.util.ArrayList;
import java.util.Arrays;
public class JavaLog {
public static void main(String[] args) throws Exception {
ArrayList<Student> pList = new ArrayList<>();
pList.add(new Student("Bob", 89));//Student("name", age)
pList.add(new Student("Mike", 78));
pList.add(new Student("John", 99));
Student[] sList = (Student[]) pList.toArray();
Arrays.sort(sList);
System.out.println(Arrays.toString(sList));
}
}
class Student implements Comparable<Student>{
...
}
当我运行代码时,我得到ClassCastException:
Exception in thread "main" java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [Lday5.Student; ([Ljava.lang.Object; is in module java.base of loader 'bootstrap'; [Lday5.Student; is in unnamed module of loader 'app')
at day5.JavaLog.main(JavaLog.java:13)
为什么Student[] sList = (Student[]) pList.toArray();
不工作
以下链接中的一些信息:
在Java中,泛型类型仅在编译时存在。在运行时有关泛型类型的信息(如您的
Student
(是删除并替换为CCD_ 3类型(查看类型擦除(。这就是为什么在运行时toArray()
不知道什么是精确的类型用于创建新数组,因此它使用Object作为最安全的类型,因为每个class extends Object
,以便它可以安全地存储任何班
现在的问题是不能将Object[]的实例强制转换为Student[]
JVM不知道(或者更准确地说,它不允许这样做。如果它可以这样做,那将违反Java类型安全(如何盲目地向下转换
Object[]
(toArray(((到Student[]
。让它知道您想要的对象类型是,您可以将类型化数组传递到toArray()
中。
解决方案:pList.toArray(Student[]::new)
更多信息:转换';数组列表<字符串>到';String[]';在Java 中