当我尝试将对象[]转换为Student[]时,为什么会出现ClassCastException



有一个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 中

最新更新