ClassCastException: Arrays$ArrayList не может быть отлит в ArrayList
1. Введение
ClassCastException это исключение времени выполнения, поднятое в Java, когда мы пытаемся неправильно разбросать класс из одного типа в другой. Он брошен, чтобы указать, что код пытался бросить объект в связанный класс, но из которых это не экземпляр.
Для более углубленного введения исключений в Java, взгляните здесь .
2. Подробности ClassCastException
Во-первых, давайте рассмотрим простой пример. Рассмотрим следующий фрагмент кода:
String[] strArray = new String[] { "John", "Snow" }; ArrayListstrList = (ArrayList ) Arrays.asList(strArray); System.out.println("String list: " + strList);
Вышеупомянутый код вызывает ClassCastException где мы отбрасываем возвратную стоимость Arrays.asList (strArray) к ArrayList.
Причина в том, что, хотя статический метод Arrays.asList() возвращает Список, мы не знаем, пока время выполнения точно, что реализация возвращается . Таким образом, на момент компиляции компилятор не может знать ни и позволяет литые .
При запуске кода проверяется фактическая реализация, которая находит это Arrays.asList () возвращает Arrays$Список вызывая тем ClassCastException .
3. Разрешение
Мы можем просто заявить о своей ArrayList в качестве Список чтобы избежать этого исключения:
ListstrList = Arrays.asList(strArray); System.out.println("String list: " + strList);
Однако, объявив нашу ссылку в качестве Список мы можем назначить любой класс, который реализует Список интерфейс , в том числе Arrays$ArrayList возвращается методом вызова.
4. Резюме
В этой статье мы видели объяснение того, что именно является ClassCastException и какие меры мы должны принять для решения этой проблемы.
Полный код можно найти более на GitHub .