· ArrayList est clonable (idem pour Set et Map), mais List n'est pas clonable.
-Je veux cloner ce qui a été passé en tant que List au lieu d'un ArrayList, mais il y a des situations où je ne peux pas le faire docilement. Que devrais-je faire?
-Un exemple est présenté ci-dessous, mais il existe une méthode pour obtenir la méthode de clonage de la classe d'objets réelle et l'appeler.
・ C'est là que je me sens frustré lorsque j'utilise Java. C'est le même regret que int ⇔ Integer peut être assigné mais int [] ⇔ Integer [] ne peut pas être assigné.
-Par exemple, si vous effectuez un keySet avec HashSet, HashMap $ KeySet sera retourné, mais ce n'est pas clonable et ne peut pas être cloné par la méthode indiquée dans l'exemple. Ce genre de chose est un problème ...
・ Une autre jambe de serpent. L'exemple utilise getDeclaredMethod. -GetDeclaredMethod (getDeclaredMethods) récupère les méthodes déclarées dans la classe. -GetMethod (getMethods) inclut les méthodes déclarées dans la classe de base.
★ Ajout ★ Comme indiqué par felis ci-dessous, vous pouvez utiliser CopyOf of List à partir de Java 10. Le programme de test ci-dessous s'exécute sur JDK 1.6.
package jp.avaj.lib.algo;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import jp.avaj.lib.test.ArTest;
import jp.avaj.lib.test.L;
/**
Liste des clones
ArrayList est clonable, mais List n'est pas clonable.Idem pour Set et Map.
*/
public class Tips0056 {
public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
List<String> list = ArList.construct("a,b,c");
List<String> newList;
//Ceci est une erreur de compilation
//newList = (List<String>)list.clone();
L.p("Tu peux le faire"); //Cependant, il est inconnu s'il s'agit d'un ArrayList lorsqu'il est passé en tant que List..
newList = (List<String>)((ArrayList)list).clone();
L.p(newList.toString());
L.p("Récupérez la méthode clone de la classe réelle et appelez");
//Obtenez la méthode de clonage dans la classe réelle.S'il y a un paramètre, spécifiez-le à la fin, mais ce n'est plus nécessaire maintenant
Method cloneMethod = list.getClass().getDeclaredMethod("clone");
//S'il n'y a pas de méthode, une exception se produira, donc si vous venez ici, il y a une méthode.
//Exécutez la méthode.S'il y a un paramètre, spécifiez-le à la fin, mais ce n'est plus nécessaire maintenant.
newList = (List<String>)cloneMethod.invoke(list);
//Vérifiez le résultat.
ArTest.equals("clone","expected",3,"size",newList.size());
ArTest.equals("clone","expected","a","(0)",newList.get(0));
ArTest.equals("clone","expected","b","(1)",newList.get(1));
ArTest.equals("clone","expected","c","(2)",newList.get(2));
//Vérifiez visuellement
L.p(newList.toString());
}
}
Le résultat est le suivant
Tu peux le faire
[a, b, c]
Récupérez la méthode clone de la classe réelle et appelez
OK clone:expected=3:size=3
OK clone:expected=a:(0)=a
OK clone:expected=b:(1)=b
OK clone:expected=c:(2)=c
[a, b, c]
Recommended Posts