2016-11-05 54 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是一个坏主意!