2017-06-14 64 views
0

首先,我的下面的代码只是提供了我的类的抽象视图,以便您可以轻松理解我的问题是关于什么:) -so也不等于,哈希码。将抽象类型的列表复制到具有特定类型的列表

我有一个ABC从可观察其具有AbstractObservers

列表扩展然后,我必须从AbstractObservers一些类B和C继承。 AbstractObservers实现Observer。

重点是现在在恢复类。

使用方法recover()我尝试返回一个带有具体类型(B或C)而不是AbstractObservers的List。

我不满意我的解决方案,我认为它可以更好,更容易?

你知道我该如何解决这个问题吗?由于Hibernate,抽象类必须保留。

预先感谢您

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 { 
} 

Ç

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

什么是使用'recover()'?看起来'recover()'的调用者将拥有上下文并能够转换为具体的List类型。但是,对于需要它成为具体类型的恢复列表做了什么? –

+0

由于列表中的类型,下一步要做什么,所以不会调用recover()的调用方。但是recover()必须已经提供了正确的类型。 – AnnaKlein

回答

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是如何工作的。

编辑:我想我很困惑你要求什么,这不会回答你的问题,如果我理解正确。

相关问题