2016-11-05 61 views
3

我有一個需要實現的接口。它看起來是這樣的:如何將Iterable <interface>返回類型方法重寫爲Iterable <?擴展接口>返回類型方法

public interface SimulationState { 
    ... 
    public Iterable<VehicleStatus> getVehicleStatuses(); 
} 

我試圖接口擴展成某種裝飾器界面如下:

public interface SimulationStateDec<V extends VehicleStatus> extends SimulationState { 
    ... 
    @Override 
    public Iterable<V> getVehicleStatuses(); 
} 

OR

public interface SimulationStateDec<V extends VehicleStatus> extends SimulationState { 
    ... 
    @Override 
    public Iterable<? extends VehicleStatus> getVehicleStatuses(); 
} 

這裏的具體的類我正在實現的接口在:

public class WareHouseState implements SimulationState { 
    ...  
    @Override 
    public Iterable<VehicleStatus> getVehicleStatuses() { 
    return this.vStatuses; 
    } 
} 

我實現在一個名爲VehicleStateVehicleStatus接口,這樣我可以在我的項目一類我打電話我具體的類

所以返回實現VehicleState 雖然可迭代該getVehicleStatuses()方法 ,我有義務每一個元素轉換爲VehicleState如下所示:

public class Gate { 
    ... 
    private ArrayList<VehicleThread> vehicles; 

    public Gate(WareHouse wareHouse, GatePriority priority) { 
     ... 
     this.vehicles = new ArrayList<>(); 
     wareHouseState.getVehicleStatuses().forEach(v -> vehicles.add(new VehicleThread((VehicleState) v, wareHouse))); 
     sortSameTimeArrivalBy(priority); 

    } 
} 

我知道我在這裏做錯了事,我想知道是否允許這種實現方式。 編譯器告訴我在實現的接口中更改方法,它不適用於我的應用程序必須在不同的框架上工作。

我需要返回各種實現相同接口的具體類型,而無需投射每個元素。

+0

這可能是一個很好的問題,但您需要提供更多詳細信息,例如顯示您打算如何使用界面的[mcve]。目前來看,這個問題太模糊了。 –

+0

請仔細閱讀以瞭解問題:https://docs.oracle.com/javase/tutorial/java/generics/inheritance.html –

+0

yes閱讀之後它是有道理的,我欣賞它 –

回答

0

這是你應該如何使用它,因爲X < A>是不可替代的X < B>即使延長B,就乾脆把可迭代< VehicleStatus>是不可替代的可迭代< V>其中,V延伸VehicleStatus .Hence,你正在改變方法的返回類型,而覆蓋

public class VehicleStatus{ 

    } 

    public interface SimulationState { 
     Iterable<? extends VehicleStatus> getVehicleStatuses(); 
    } 

    public interface SimulationStateDec<V extends VehicleStatus> extends SimulationState { 
    @Override 
    public Iterable<V> getVehicleStatuses(); 
    } 
1

你不能,因爲覆蓋,當你只能縮小返回類型錯誤,也不Iterable<V>也不Iterable<? extends VehicleStatus>Iterable<VehicleStatus>亞型。

在Java 8,你也許可以添加新的方法,無需重寫並實現舊的默認(或使用在以前的版本中抽象類):

public interface SimulationStateDec<V extends VehicleStatus> extends SimulationState { 
    ... 
    Iterable<V> getVehicleStatusesDec(); 

    default Iterable<VehicleStatus> getVehicleStatuses() { 
     return (Iterable<VehicleStatus>) getVehicleStatusesDec(); 
    } 
} 

這應該是安全的,因爲Iterable<T>不有任何以T爲參數的方法:它應該是協變的,除了Java不支持;與例如相同List是一個壞主意!