Почему возникает исключение ClassCastException, когда я пытаюсь преобразовать объект [] в Student []? - PullRequest
3 голосов
/ 12 июля 2020

есть 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)

1 Ответ

3 голосов
/ 12 июля 2020

Почему Student[] sList = (Student[]) pList.toArray(); не работает?

Некоторая информация из приведенной ниже ссылки:

В Java тип generi c существует только во время компиляции. Во время выполнения информация о типе generi c (например, в вашем случае Student) удаляется и заменяется типом Object (обратите внимание на стирание типа). Вот почему во время выполнения toArray() понятия не имеют, какой именно тип использовать для создания нового массива, поэтому он использует Object как самый безопасный тип, потому что каждый class extends Object, поэтому он может безопасно хранить экземпляр любого класса.

Теперь проблема в том, что вы не можете преобразовать экземпляр Object [] в Student [].

JVM не знать (или, точнее, это не разрешено делать. Если бы он мог это сделать, это нарушило бы безопасность типов Java), как слепо понижать Object[] (результат toArray ()) до Student[]. Чтобы сообщить ему, какой тип объекта вам нужен, вы можете передать типизированный массив в toArray().

Решение: pList.toArray(Student[]::new)

Подробнее: Преобразование ' ArrayList в 'String []' в Java

...