ClassCastException: Arrays $ ArrayList kann nicht in ArrayList umgewandelt werden

1. Einleitung

ClassCastException ist eine Laufzeitausnahme, die in Java ausgelöst wird, wenn wir versuchen, eine Klasse nicht ordnungsgemäß von einem Typ in einen anderen umzuwandeln . Es wird ausgelöst, um anzuzeigen, dass der Code versucht hat, ein Objekt in eine verwandte Klasse umzuwandeln, von der es sich jedoch nicht um eine Instanz handelt.

Eine ausführlichere Einführung in Ausnahmen in Java finden Sie hier.

2. ClassCastException-Details

Schauen wir uns zunächst ein einfaches Beispiel an. Betrachten Sie das folgende Code-Snippet:

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

Der obige Code verursacht eine ClassCastException, bei der der Rückgabewert von Arrays.asList (strArray) in eine ArrayList umgewandelt wird.

Der Grund dafür ist, dass obwohl die statische Methode Arrays.asList () eine Liste zurückgibt , wir bis zur Laufzeit nicht genau wissen, welche Implementierung zurückgegeben wird . Zur Kompilierungszeit kann der Compiler es also auch nicht wissen und erlaubt die Besetzung .

Wenn der Code ausgeführt wird, wird die tatsächliche Implementierung überprüft, wobei festgestellt wird, dass Arrays.asList () eine Arrays $ List zurückgibt, wodurch eine ClassCastException verursacht wird .

3. Auflösung

Wir können unsere ArrayList einfach als Liste deklarieren , um diese Ausnahme zu vermeiden:

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

Indem wir unsere Referenz als Liste deklarieren, können wir jedoch jede Klasse zuweisen , die die List- Schnittstelle implementiert , einschließlich der vom Methodenaufruf zurückgegebenen Arrays $ ArrayList .

4. Zusammenfassung

In diesem Artikel haben wir die Erklärung gesehen, was genau eine ClassCastException ist und welche Maßnahmen wir ergreifen müssen, um dieses Problem zu beheben.

Den vollständigen Code finden Sie auf GitHub.