Hallo allerseits
Ich möchte von einer Collection eine deep copy (Klon-Objekt) machen und nutze dazu eine Methode namens getDeepCopy, die wiederum die Serialisierung einsetzt, um eine exakte Kopie des übergebenen Objekts (Collection mit gesamten Inhalt) zu erzeugen. Nun, das Problem ist folgendes:
Die überbegene Collection kann eine List-Instanz oder auch eine TreeSet-Instanz sein, wobei die in der Collection enthaltene Objekte vom Typ A oder vom Typ B sind. Dabei ist die Klasse B eine Subklasse der Klasse A (es gibt auch noch weitere Subklassen, aber hier nicht weiter relevant). Meine jetzige Lösung sieht wie folgt aus:
Wenn ich jetzt ein TreeSet übergeben möchte, muss ich in der Aufrufer-Methode zuerst den Inhalt aus dem TreeSet in eine ArrayList kopieren, diese zum klonen übergeben und anschliesesnd den in der zurückgegebenen ArrayList enthaltenen Inhalt wieder in ein TreeSet kopieren. Kann man machen, aber ich finde es nicht so elegant. Sicher könnte ich noch eine zweite Methode implementieren, die anstatt mit ArrayList halt mit TreeSet arbeitet. Ich frage mich, ob meine Methode getDeepCopy nicht so definiert werden könnte, dass sie mir den gleichen Collection-Typ zurückgibt, den sie auch erhalten hat. Sollte etwa so aussehen:
Kann man so was elegant lösen, ohne dass man mit getClass usw. hantieren muss und dass der Rückgabewert-Typ Collection wird, da etwas "zu allgemein". Das Ziel wäre eben, dass der Rückgabewert-Typ dem übergebenen Collection-Typ entspricht: ArrayList bzw. TreeSet. Und falls ja, wie sehe dies syntaxmässig aus?
Danke.
Ich möchte von einer Collection eine deep copy (Klon-Objekt) machen und nutze dazu eine Methode namens getDeepCopy, die wiederum die Serialisierung einsetzt, um eine exakte Kopie des übergebenen Objekts (Collection mit gesamten Inhalt) zu erzeugen. Nun, das Problem ist folgendes:
Die überbegene Collection kann eine List-Instanz oder auch eine TreeSet-Instanz sein, wobei die in der Collection enthaltene Objekte vom Typ A oder vom Typ B sind. Dabei ist die Klasse B eine Subklasse der Klasse A (es gibt auch noch weitere Subklassen, aber hier nicht weiter relevant). Meine jetzige Lösung sieht wie folgt aus:
Java:
public static <T> ArrayList<T> getDeepCopy(ArrayList<T> param) throws Exception
{
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
new ObjectOutputStream(byteArrayOut).writeObject(param);
ByteArrayInputStream byteArrayIn = new ByteArrayInputStream(byteArrayOut.toByteArray());
return (ArrayList<T>) new ObjectInputStream(byteArrayIn).readObject();
}
Wenn ich jetzt ein TreeSet übergeben möchte, muss ich in der Aufrufer-Methode zuerst den Inhalt aus dem TreeSet in eine ArrayList kopieren, diese zum klonen übergeben und anschliesesnd den in der zurückgegebenen ArrayList enthaltenen Inhalt wieder in ein TreeSet kopieren. Kann man machen, aber ich finde es nicht so elegant. Sicher könnte ich noch eine zweite Methode implementieren, die anstatt mit ArrayList halt mit TreeSet arbeitet. Ich frage mich, ob meine Methode getDeepCopy nicht so definiert werden könnte, dass sie mir den gleichen Collection-Typ zurückgibt, den sie auch erhalten hat. Sollte etwa so aussehen:
Java:
public static CollectionTyp<InhaltTyp> getDeepCopy(CollectionMitInhalt)
{
// ...
}
Kann man so was elegant lösen, ohne dass man mit getClass usw. hantieren muss und dass der Rückgabewert-Typ Collection wird, da etwas "zu allgemein". Das Ziel wäre eben, dass der Rückgabewert-Typ dem übergebenen Collection-Typ entspricht: ArrayList bzw. TreeSet. Und falls ja, wie sehe dies syntaxmässig aus?
Danke.