«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.