zunächst mein Code unten liefert nur eine abstrakte Ansicht meiner Klassen, so dass Sie leicht verstehen, was meine Frage ist :) -so auch nicht gleich , Hash-Code.Machen Sie eine Kopie einer Liste mit abstrakten Typ zu einer Liste mit spezifischen Typ
Ich habe ein ABC von beobachtbare erweitert, die eine Liste der AbstractObservers hat
Dann habe ich einige Klassen B und C vererben AbstractObservers. AbstractObserver implementiert Observer.
Der Fokus liegt nun auf der Recover-Klasse.
Mit der Methode recover() versuche ich eine Liste mit dem konkreten Typ (B oder C) anstelle von AbstractObserver zurück zu geben.
Ich bin nicht zufrieden mit meiner Lösung, ich denke, es könnte besser sein, einfacher?
Haben Sie eine Idee, wie ich dieses Problem besser lösen könnte? Die abstrakten Klassen müssen aufgrund von Hibernate bleiben.
Vielen Dank im Voraus
public abstract class ABCObservable extends Observable {
List<AbstractObserver> abstractObserverList = new LinkedList<>();
public List<AbstractObserver> getAbstractObserverList() {
return abstractObserverList;
}
@Override
public synchronized void addObserver(Observer o) {
super.addObserver(o);
abstractObserverList.add((AbstractObserver) o);
}
}
AbstractObserver
public abstract class AbstractObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
}
}
B
public class B extends AbstractObserver {
}
C
public class C extends AbstractObserver {
}
Recover
public class Recover {
public List<? extends AbstractObserver> recover(ABCObservable abcObservable) {
List<AbstractObserver> returnList = new LinkedList<>(); //does that delivers a List with AbstractObserver or B or C?
if (abcObservable.getAbstractObserverList().get(0) instanceof B) {
returnList = new LinkedList<>();
returnList.addAll(abcObservable.getAbstractObserverList());
} else if (abcObservable.getAbstractObserverList().get(0) instanceof C) {
returnList = new LinkedList<>();
returnList.addAll(abcObservable.getAbstractObserverList());
}
return returnList; // returns a List with B or C elements
}
}
Was verwendet 'recover()'? Es scheint, dass der Aufrufer von 'recover()' den Kontext hätte und in der Lage wäre, in den konkreten Listentyp zu konvertieren. Aber was wird mit der wiederhergestellten Liste gemacht, die sie als konkreten Typ braucht? –
Nein der Aufrufer von recover() entscheidet aufgrund des Typs in der Liste, was als nächstes zu tun ist. Aber recover() muss bereits den richtigen Typ liefern. – AnnaKlein