· ArrayList ist klonbar (dasselbe gilt für Set und Map), List ist jedoch nicht klonbar.
-Ich möchte klonen, was als Liste anstelle einer ArrayList übergeben wurde, aber es gibt Situationen, in denen ich es nicht gehorsam tun kann. Was soll ich machen?
・ Hier bin ich frustriert, wenn ich Java verwende. Es ist das gleiche Bedauern, dass int ⇔ Integer zugewiesen werden kann, int [] ⇔ Integer [] jedoch nicht zugewiesen werden kann.
・ Noch ein Schlangenbein. Das Beispiel verwendet getDeclaredMethod. -GetDeclaredMethod (getDeclaredMethods) ruft die in der Klasse deklarierten Methoden ab. -GetMethod (getMethods) enthält die in der Basisklasse deklarierten Methoden.
★ Ergänzung ★ Wie von felis unten ausgeführt, können Sie CopyOf of List von Java 10 aus verwenden. Das folgende Testprogramm läuft auf 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;
/**
Klonliste
ArrayList ist klonbar, List jedoch nicht klonbar.Gleiches gilt für Set und 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;
//Dies ist ein Kompilierungsfehler
//newList = (List<String>)list.clone();
L.p("Du kannst das"); //Es ist jedoch nicht bekannt, ob es sich um eine ArrayList handelt, wenn sie als Liste übergeben wird..
newList = (List<String>)((ArrayList)list).clone();
L.p(newList.toString());
L.p("Holen Sie sich die Klonmethode aus der tatsächlichen Klasse und rufen Sie sie auf");
//Holen Sie sich die Klonmethode in der aktuellen Klasse.Wenn es einen Parameter gibt, geben Sie ihn am Ende an, aber er ist jetzt nicht mehr erforderlich
Method cloneMethod = list.getClass().getDeclaredMethod("clone");
//Wenn es keine Methode gibt, tritt eine Ausnahme auf. Wenn Sie also hierher kommen, gibt es eine Methode.
//Führen Sie die Methode aus.Wenn es einen Parameter gibt, geben Sie ihn am Ende an, aber er ist jetzt nicht mehr erforderlich.
newList = (List<String>)cloneMethod.invoke(list);
//Überprüfen Sie das Ergebnis.
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));
//Visuell prüfen
L.p(newList.toString());
}
}
Das Ergebnis ist wie folgt
Du kannst das
[a, b, c]
Holen Sie sich die Klonmethode aus der tatsächlichen Klasse und rufen Sie sie auf
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