Перейти к основному содержимому

ClassCastException: Arrays$ArrayList не может быть приведен к ArrayList

· 2 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

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 .