2017-06-14 37 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是如何工作的。

編輯:我想我很困惑你要求什麼,這不會回答你的問題,如果我理解正確。

相關問題