ClassCastException: Масиви $ ArrayList не могат да бъдат прехвърлени в ArrayList

1. Въведение

ClassCastException е изключение по време на изпълнение, повдигнато в Java, когато се опитваме да прехвърлим неправилно клас от един тип в друг. Той се хвърля, за да покаже, че кодът се е опитал да хвърли обект към свързан клас, но не е екземпляр.

За по-задълбочено въведение в изключенията в Java, погледнете тук.

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 () връща списък, ние не знаем до изпълнение точно какво изпълнение се връща . Така че по време на компилация компилаторът не може да знае нито едното, нито другото и разрешава гласовете .

Когато кодът се изпълни, се проверява действителната реализация, която установява, че Arrays.asList () връща $ Списък от масиви, като по този начин причинява ClassCastException .

3. Резолюция

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

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

Чрез деклариране на нашата референция като Списък можем да присвоим всеки клас, който реализира интерфейса List , включително Arrays $ ArrayList, върнати от извикването на метода.

4. Обобщение

В тази статия видяхме обяснението какво точно е ClassCastException и какви мерки трябва да предприемем, за да решим този проблем.

Пълният код може да бъде намерен в GitHub.