wake-up-neo.com

casting Arrays.asList verursacht eine Ausnahme: Java.util.Arrays $ ArrayList kann nicht in Java.util.ArrayList umgewandelt werden

Ich bin neu in Java und versuche zu verstehen, warum das erste Code-Snippet diese Ausnahme nicht verursacht, das zweite jedoch. Sollten in beiden Fällen ein String-Array an Arrays.asList übergeben werden, sollten nicht beide Ausschnitte eine Ausnahme oder keine Ausnahme erzeugen? 

Exception in thread "main" Java.lang.ClassCastException: Java.util.Arrays$ArrayList cannot be cast to Java.util.ArrayList

Erstes Snippet (verursacht keine Ausnahme):

ArrayList<ArrayList<String>> stuff = new ArrayList<ArrayList<String>>();
String line = "a,b,cdef,g";
String delim = ",";
String[] pieces = line.split(delim);
stuff.add((ArrayList<String>) Arrays.asList(pieces));

Zweiter Ausschnitt (Ursachen oberhalb der Ausnahme):

ArrayList<ArrayList<String>> stuff = new ArrayList<ArrayList<String>>();
String[] titles = {"ticker", "grade", "score"};
stuff.add((ArrayList<String>) Arrays.asList(titles));

Falls relevant, verwende ich JavaSE 1.6 in Eclipse Helios.

37
DannyTree

Für mich (mit Java 1.6.0_26) gibt der erste Ausschnitt die gleiche Ausnahme wie der zweite aus. Der Grund ist, dass die Arrays.asList(..) -Methode nur eine List zurückgibt, nicht notwendigerweise eine ArrayList. Da Sie nicht wirklich wissen, welche Art (oder Implementierung von) von List die Methode zurückgibt, ist Ihre Umwandlung in ArrayList<String> nicht sicher. Das Ergebnis ist, dass es wie erwartet funktionieren kann oder nicht. Aus der Sicht des Codierstils wäre eine gute Lösung, Ihre stuff-Deklaration in Folgendes zu ändern:

List<List<String>> stuff = new ArrayList<List<String>>();

damit können Sie hinzufügen, was sich aus der Arrays.asList(..)-Methode ergibt.

31
Waldheinz

Wenn Sie dies tun, erhalten Sie keine CCE:

ArrayList<ArrayList<String>> stuff = new ArrayList<ArrayList<String>>();
String[] titles = {"ticker", "grade", "score"};
stuff.add(new ArrayList<String>(Arrays.asList(titles)));

Wie der Fehler eindeutig besagt, ist die Klasse Java.util.ArrayList nicht mit der verschachtelten statischen Klasse Java.util.Arrays.ArrayList identisch. Daher die Ausnahme. Wir überwinden dies, indem wir die zurückgegebene Liste mit einem Java.util.ArrayList umschließen.

10
adarshr

Das Problem ist, dass Sie angegeben haben, dass Ihre Liste ArrayLists enthält - und implizit keine anderen Listenimplementierungen . Arrays.asList() gibt eine eigene Implementierung einer Liste zurück, die auf der Implementierung des Array-Parameters basiert, wobei möglicherweise nicht eine ArrayList ist. Das ist dein Problem.

Allgemeiner gesagt, Sie haben ein klassisches Code-Stil-Problem: Sie sollten sich auf abstrakte Schnittstellen (dh List) beziehen, nicht auf konkrete Implementierungen (dh ArrayList). So sollte Ihr Code aussehen:

List<List<String>> stuff = new ArrayList<List<String>>();
String[] titles = { "ticker", "grade", "score" };
stuff.add((List<String>) Arrays.asList(titles));

Ich habe diesen Code getestet und er läuft fehlerfrei.

10
Bohemian

Kein manuelles Casting erforderlich. Dieser einfache Code kann Ihnen helfen,

List stuff = new ArrayList();
String line = "a,b,cdef,g";
String delim = ",";
stuff.addAll(Arrays.asList(line.split(delim)));
8
Srinivasan.S

Wenn Sie Ihre Eigenschaft als ArrayList <'T'> verwenden möchten, müssen Sie nur dort deklarieren und einen Getter erstellen.

    private static ArrayList<String> bandsArrayList;

    public ArrayList<String> getBandsArrayList() {
        if (bandsArrayList == null) {
            bandsArrayList = new ArrayList<>();

            String[] bands = {"Metallica", "Iron Maiden", "Nirvana"};
            bandsArrayList.addAll(Arrays.asList(bands));
        }
        return bandsArrayList;
    }

Initialisiert die Variable und verwendet die Methode [addAll (Collection collection)] ( http://developer.Android.com/intl/pt-br/reference/Java/util/ArrayList.html#addAll(Java.util.Collection ))

1
GFPF

Mit einem Debugger habe ich festgestellt, dass Array.asList (Titel) eine "Arrays $ ArrayList" (dh eine innere Klasse der Arrays-Klasse) und keine Java.util.ArrayList zurückgibt.

Es ist immer am besten, die Schnittstelle auf der linken Seite von Ausdrücken zu verwenden, in diesem Fall List anstelle der konkreten ArrayList. Das funktioniert gut:

    List<List<String>> stuff = new ArrayList<List<String>>();
    String[] titles = {"ticker", "grade", "score"};
    stuff.add((List<String>) Arrays.asList(titles));
1
Ant Kutschera

Zunächst sollte Arrays.asList () niemals in ArrayList umgewandelt werden. Zweitens: Da Generics in Java-Programmiersprachen eingeführt wurden, ist das Casting nach wie vor relevant, wenn ältere, vorgenerische APIs verwendet werden.

Drittens verwenden Sie niemals konkrete Klassen links vom Zuweisungsoperator. 

Unterm Strich sagen wir 

List<List<String>> stuff = new ArrayList<List<String>>();
String line = "a,b,cdef,g";
String delim = ",";
String[] pieces = line.split(delim);
stuff.add(Arrays.asList(pieces));



List<List<String>> stuff = new ArrayList<List<String>>();
String[] titles = {"ticker", "grade", "score"};
stuff.add(Arrays.asList(titles));

und sei glücklich.

0
AlexR