首先,我的代码只提供了我的类的抽象视图,以便您可以轻松地理解我的问题是什么:) - 所以也没有等于,哈希码。
我从可观察扩展了ABC,其中包含 AbstractObservers 的列表
然后我有一些类 B和C 继承自AbstractObservers。 AbstractObservers实现了Observer。
现在重点是恢复课程。
使用方法recover(),我尝试返回一个具有混凝土类型(B或C)而不是AbstractObservers的List。
我对我的解决方案不满意,我认为它会更好,更容易吗?
你知道如何更好地解决这个问题吗?由于Hibernate,Abstract类必须保持不变。
提前谢谢
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) {
}
}
乙
public class B extends AbstractObserver {
}
C
public class C extends AbstractObserver {
}
恢复
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 :(得分:0)
在Java中,您无法将列表转换为新类型,但您可以执行的操作是创建一个新列表并将值添加到其中。如果使用通用方法,则应该能够实现此目的。我没有测试这段代码,但理论上它应该可以工作:
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;
}
此代码段不使用已定义的类,而是使用T
,您可以了解有关Java通用方法如何在this Java Tutorial by Oracle上运行的更多信息。