java.util.Arrays.asList () ne remplace pas le nouveau ArrayList <> ()

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)

Répondez lorsque vous voulez vraiment définir et initialiser la liste sur une ligne

(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

java.util.Arrays.asList () ne remplace pas le nouveau ArrayList <> ()
Le calendrier Java n'est pas un singleton.
[Pour les débutants en programmation] Qu'est-ce qu'une méthode?
Un mémo pour moi que l'orientation de l'objet est quelque chose
rail nouveau nom d'application non créé
La clé publique pour jenkins-2.249.1-1.1.noarch.rpm n'est pas installée