ClassCastException: Polia $ ArrayList nie je možné prenášať na ArrayList

1. Úvod

ClassCastException je runtime výnimka vyvolaná v Jave, keď sa o to pokúšame nesprávne zaradiť triedu z jedného typu do druhého. Vyvoláva sa na označenie, že kód sa pokúsil preniesť objekt do súvisiacej triedy, ale nejde o inštanciu.

Podrobnejší úvod k výnimkám v Jave nájdete tu.

2. Podrobnosti o výnimke ClassCast

Najprv sa pozrime na jednoduchý príklad. Zvážte nasledujúci útržok kódu:

Reťazec [] strArray = nový Reťazec [] {"John", "Snow"}; ArrayList strList = (ArrayList) Arrays.asList (strArray); System.out.println ("Zoznam reťazcov:" + strList);

Vyššie uvedený kód spôsobuje ClassCastException kde vrháme návratovú hodnotu Arrays.asList (strArray) do an ArrayList.

Dôvod je ten, že hoci statická metóda Arrays.asList () vracia a Zoznam,do runtime presne nevieme, aká implementácia sa vráti. Takže v čase kompilácie to nemôže vedieť ani kompilátor a umožňuje obsadenie.

Po spustení kódu sa skontroluje skutočná implementácia, ktorá to zistí Arrays.asList() vráti znak Pole $ List čím spôsobuje a ClassCastException.

3. Uznesenie

Môžeme jednoducho vyhlásiť svoje ArrayList ako Zoznam vyhnúť sa tejto výnimke:

Zoznam strList = Arrays.asList (strArray); System.out.println ("Zoznam reťazcov:" + strList);

Avšak vyhlásením nášho odkazu za a Zoznam môžeme priradiť akákoľvek trieda, ktorá implementuje Zoznam rozhranie, vrátane Pole $ ArrayList vrátené volaním metódy.

4. Zhrnutie

V tomto článku sme videli vysvetlenie, čo to vlastne je ClassCastException a aké opatrenia musíme prijať, aby sa tento problém vyriešil.

Celý kód nájdete na GitHub.