2017-06-14 2 views
0

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 
    } 
} 
+0

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? –

+0

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

Antwort

0

In Java können Sie keine Liste auf eine neue Art konvertieren, was Sie tun können, ist jedoch eine neue zu erstellen und die Werte, um es hinzuzufügen . Wenn Sie eine generische Methode verwenden, sollten Sie dies erreichen können. Ich habe diesen Code nicht testen, aber theoretisch sollte es funktionieren:

public <T> List<T> recover(T abcObservable) { 
    List<AbstractObserver> list = abcObservable.getAbstractObserverList(); 
    List<T> returnList = new LinkedList<>(); 
    returnList = new LinkedList<>(); 

    for(AbstractObserver a : list) { 
     if(a instanceof T) { 
      returnList.add(a); 
     } 
    } 

    return returnList; 
} 

Statt eine definierte Klasse der Verwendung dieser Ausschnitt T verwendet, können Sie erfahren Sie mehr darüber, wie Java generische Methoden auf this Java Tutorial by Oracle arbeiten.

EDIT: Ich denke, ich bin verwirrt über das, was Sie verlangen, dies beantwortet nicht Ihre Frage, wenn ich es richtig verstehe.

Verwandte Themen