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.