Cette fois, je voudrais expliquer l'histoire selon laquelle "java.util.Arrays.asList ()" ne remplace pas "new ArrayList <> ()". Soudain, c'est un exemple.
before
List<String> fruts = new ArrayList<>();
fruts.add("apple");
fruts.add("orange");
fruts.add("strawberry");
À
after
List<String> fruts = Arrays.asList("apple", "orange", "strawberry");
** Il est dangereux pour un critique de le réparer car il sera raccourci. ** **
Pensez-vous que cette interface fonctionnera pour vous?
void show(List<String> fruts);
Il n'y a pas de problème si vous travaillez en tant que collection, mais cela peut provoquer une erreur selon l'implémentation de l'interface.
** Comme vous pouvez le voir en regardant le type d'instance, l'instance créée par java.util.Arrays.asList ()
n'est pas java.util.ArrayList
mais java.util.Arrays $ ArrayList
. ** **
Si quelque chose ne va pas, c'est à propos de cette différence.
Vérifions avec l'application de démonstration suivante.
Application de démonstration
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();
}
}
}
Résultat de l'opération
[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)
Comme il est masqué par l'interface, il est préférable de changer la reconnaissance qu'il fonctionnera toujours même s'il est remplacé par ʻArrays.asList`.
** Bien qu'il y ait un problème fondamental avec sa mise en œuvre, ... **
L'auteur a rencontré " java.lang.ClassCastException: java.util.Arrays $ ArrayList ne peut pas être converti en java.util.ArrayList
"alors j'ai décidé d'écrire cet article.
Il n'y avait rien de mal avec l'interface, donc je n'ai pas trouvé que c'était une erreur avant l'exécution.
** Le titre cette fois est également correct, "Si vous remplacez new ArrayList <> ()
parjava.util.Arrays.asList ()
, une erreur se produira en fonction de l'implémentation." ** **
(Ajouté le 24/11/2018)
(Méthode 1) Tableaux.asList()Défini sur le constructeur de ArrayList
List<String> fruts = new ArrayList<>(Arrays.asList("apple", "orange", "strawberry"));
Si vous indiquez que vous pouvez utiliser ʻArrays.asList () `, il convient de l'utiliser avec le constructeur.
(Méthode 2) Appeler une méthode lors de la création d'une instance
List<String> fruts = new ArrayList<String>() {
{
add("apple");
add("orange");
add("strawberry");
}
};
(Méthode 2) a une méthode de description légèrement unique, mais c'est également grammaticalement correcte.
Recommended Posts