Dieses Mal möchte ich die Geschichte erklären, dass "java.util.Arrays.asList ()" kein Ersatz für "neue ArrayList <> ()" ist. Plötzlich ist dies ein Beispiel.
before
List<String> fruts = new ArrayList<>();
fruts.add("apple");
fruts.add("orange");
fruts.add("strawberry");
Zu
after
List<String> fruts = Arrays.asList("apple", "orange", "strawberry");
** Es ist gefährlich für einen Prüfer, es zu reparieren, da es verkürzt wird. ** **.
Denken Sie, dass diese Schnittstelle für Sie funktioniert?
void show(List<String> fruts);
Es gibt kein Problem, wenn Sie als Sammlung arbeiten, aber es kann abhängig von der Implementierung der Schnittstelle einen Fehler verursachen.
** Wie Sie dem Instanztyp entnehmen können, ist die von java.util.Arrays.asList ()
erstellte Instanz nicht java.util.ArrayList
, sondern java.util.Arrays $ ArrayList
. ** **.
Wenn etwas schief geht, geht es um diesen Unterschied.
Lassen Sie uns mit der folgenden Demo-App überprüfen.
Demo-App
package com.example;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Demo {
public static void main(String[] args) {
List<String> fruts1 = new ArrayList<>();
fruts1.add("apple");
fruts1.add("orange");
fruts1.add("strawberry");
show(fruts1);
System.out.println("------------------------------------------------------------");
List<String> fruts2 = Arrays.asList("apple", "orange", "strawberry");
show(fruts2);
}
private static void show(List<String> fruts) {
System.out.println(fruts + " is " + fruts.getClass().toString());
if (java.util.ArrayList.class.isAssignableFrom(fruts.getClass())) {
System.out.println("OK : java.util.ArrayList.class.isAssignableFrom(fruts.getClass())");
} else {
System.out.println("NG : java.util.ArrayList.class.isAssignableFrom(fruts.getClass())");
}
if (java.util.List.class.isAssignableFrom(fruts.getClass())) {
System.out.println("OK : java.util.List.class.isAssignableFrom(fruts.getClass())");
} else {
System.out.println("NG : java.util.List.class.isAssignableFrom(fruts.getClass())");
}
if (java.util.ArrayList.class.isInstance(fruts)) {
System.out.println("OK : java.util.ArrayList.class.isInstance(fruts)");
} else {
System.out.println("NG : java.util.ArrayList.class.isInstance(fruts)");
}
if (java.util.List.class.isInstance(fruts)) {
System.out.println("OK : java.util.List.class.isInstance(fruts)");
} else {
System.out.println("NG : java.util.List.class.isInstance(fruts)");
}
if (fruts instanceof java.util.List) {
System.out.println("OK : fruts instanceof java.util.List");
} else {
System.out.println("NG : fruts instanceof java.util.List");
}
if (fruts instanceof java.util.ArrayList) {
System.out.println("OK : fruts instanceof java.util.ArrayList");
} else {
System.out.println("NG : fruts instanceof java.util.ArrayList");
}
try {
List<String> castObj = (List<String>) fruts;
System.out.println("OK : List<String> castObj = (List<String>) fruts;");
} catch(Exception e) {
e.printStackTrace();
}
try {
List<String> castObj = (ArrayList<String>) fruts;
System.out.println("OK : List<String> castObj = (ArrayList<String>) fruts");
} catch(Exception e) {
e.printStackTrace();
}
}
}
Betriebsergebnis
[apple, orange, strawberry] is class java.util.ArrayList
OK : java.util.ArrayList.class.isAssignableFrom(fruts.getClass())
OK : java.util.List.class.isAssignableFrom(fruts.getClass())
OK : java.util.ArrayList.class.isInstance(fruts)
OK : java.util.List.class.isInstance(fruts)
OK : fruts instanceof java.util.List
OK : fruts instanceof java.util.ArrayList
OK : List<String> castObj = (List<String>) fruts;
OK : List<String> castObj = (ArrayList<String>) fruts
------------------------------------------------------------
[apple, orange, strawberry] is class java.util.Arrays$ArrayList
NG : java.util.ArrayList.class.isAssignableFrom(fruts.getClass())
OK : java.util.List.class.isAssignableFrom(fruts.getClass())
NG : java.util.ArrayList.class.isInstance(fruts)
OK : java.util.List.class.isInstance(fruts)
OK : fruts instanceof java.util.List
NG : fruts instanceof java.util.ArrayList
OK : List<String> castObj = (List<String>) fruts;
java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
at com.example.Demo.show(Demo.java:59)
at com.example.Demo.main(Demo.java:17)
Da es von der Schnittstelle ausgeblendet wird, ist es besser, die Erkennung zu ändern, dass es immer funktioniert, auch wenn Sie es durch "Arrays.asList" ersetzen.
** Obwohl es ein grundlegendes Problem bei der Implementierung gibt, ... **
Der Autor stieß auf " java.lang.ClassCastException: java.util.Arrays $ ArrayList kann nicht in java.util.ArrayList
umgewandelt werden ", daher habe ich beschlossen, diesen Artikel zu schreiben.
An der Benutzeroberfläche war nichts auszusetzen, sodass ich sie erst zur Laufzeit als Fehler empfand.
** Der Titel dieses Mal ist auch korrekt: "Wenn Sie" neue ArrayList <> () "durch" java.util.Arrays.asList () "ersetzen, tritt je nach Implementierung ein Fehler auf." ** **.
(Hinzugefügt am 24.11.2018)
(Methode 1) Arrays.asList()Auf den Konstruktor von ArrayList setzen
List<String> fruts = new ArrayList<>(Arrays.asList("apple", "orange", "strawberry"));
Wenn Sie darauf hinweisen, dass Sie "Arrays.asList ()" verwenden können, sollten Sie es zusammen mit dem Konstruktor verwenden.
(Methode 2) Rufen Sie beim Erstellen einer Instanz eine Methode auf
List<String> fruts = new ArrayList<String>() {
{
add("apple");
add("orange");
add("strawberry");
}
};
(Methode 2) hat eine leicht eindeutige Beschreibungsmethode, die jedoch auch grammatikalisch korrekt ist.
Recommended Posts