ClassCastException: Nizovi $ ArrayList ne mogu se prebaciti na ArrayList

1. Uvod

ClassCastException je runtime iznimka pokrenuta u Javi kada to pokušamo nepropisno prebacili razred iz jednog u drugi tip. Baca se kako bi se naznačilo da je kôd pokušao prebaciti objekt u povezanu klasu, ali čiji slučaj nije.

Za detaljniji uvod u iznimke na Javi pogledajte ovdje.

2. Pojedinosti o ClassCastException

Prvo, pogledajmo jednostavan primjer. Razmotrite sljedeći isječak koda:

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

Gornji kod uzrokuje ClassCastException gdje bacimo povratnu vrijednost od Arrays.asList (strArray) do an ArrayList.

Razlog je taj što iako je statička metoda Arrays.asList () vraća a Popis,ne znamo dok se izvršava točno koja se implementacija vraća. Dakle, u vrijeme kompajliranja prevoditelj ne može znati ni jedno ni drugo i dopušta glumačku postavu.

Kada se kôd pokrene, provjerava se stvarna implementacija koja to pronalazi Nizovi.asList() vraća an Nizovi $ Popis uzrokujući tako a ClassCastException.

3. Razlučivost

Jednostavno možemo proglasiti svoje ArrayList kao Popis da izbjegnemo ovu iznimku:

Popis strList = Arrays.asList (strArray); System.out.println ("Popis nizova:" + strList);

Međutim, deklarirajući našu referencu kao Popis možemo dodijeliti bilo koja klasa koja implementira Popis sučelje, uključujući Nizovi $ ArrayList vraćen pozivom metode.

4. Sažetak

U ovom smo članku vidjeli objašnjenje što je zapravo ClassCastException i koje mjere moramo poduzeti kako bismo riješili ovaj problem.

Cjeloviti kod možete pronaći na GitHubu.