将具有抽象类型的List的副本复制到具有特定类型的List

时间:2017-06-14 13:20:28

标签: java

首先,我的代码只提供了我的类的抽象视图,以便您可以轻松地理解我的问题是什么:) - 所以也没有等于,哈希码。

我从可观察扩展了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
    }
}

1 个答案:

答案 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上运行的更多信息。

编辑:我觉得我对你要求的内容感到困惑,如果我理解正确的话,这不会回答你的问题。