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