ClassCastException: массивы $ ArrayList не могут быть преобразованы в ArrayList

ClassCastException: массивы $ ArrayList не могут быть преобразованы в ArrayList

1. Вступление

ClassCastException - это исключение времени выполнения, которое возникает в Java, когда мы пытаемся выполнитьimproperly cast a class from one type to another.. Оно генерируется, чтобы указать, что код попытался преобразовать объект в связанный класс, но экземпляром которого он не является.

Для более глубокого введения в исключения в Java посмотритеhere.

2. ClassCastException Подробности

Во-первых, давайте рассмотрим простой пример. Рассмотрим следующий фрагмент кода:

String[] strArray = new String[] { "John", "Snow" };
ArrayList strList = (ArrayList) Arrays.asList(strArray);
System.out.println("String list: " + strList);

Приведенный выше код вызываетClassCastException, где мы приводим возвращаемое значениеArrays.asList(strArray) кArrayList.

Причина в том, что хотя статический методArrays.asList() возвращаетList,we don’t know until runtime exactly what implementation is returned. Таким образом, во время компиляции компилятор не может знать ни того, ни другого и разрешает приведение.

Когда код запускается, проверяется фактическая реализация, которая обнаруживает, чтоArrays.asList () возвращаетArrays$List, что вызываетClassCastException.

3. разрешение

Мы можем просто объявить нашArrayList какList, чтобы избежать этого исключения:

List strList = Arrays.asList(strArray);
System.out.println("String list: " + strList);

Однако, объявив нашу ссылку какList, мы можем назначитьany class that implements the List interface, включаяArrays$ArrayList, возвращаемые вызовом метода.

4. Резюме

В этой статье мы увидели объяснение того, что такоеClassCastException и какие меры мы должны предпринять, чтобы исправить эту проблему.

Полный код можно найти вover on GitHub.