2016-11-05 6 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(); 
} 

또는 여기

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

나는 그래서 내가 전화하고 내 프로젝트의 클래스에서

그래서 내 콘크리트 클래스에서 구현 된 VehicleState 의 Iterable 생각을 반환 할 수 VehicleState라는 이름의 클래스에서 VehicleStatus 인터페이스를 구현하고있다

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); 

    } 
} 
다음 getVehicleStatuses() 방법 와 나는 다음과 같은 VehicleState에 모든 요소를 ​​캐스팅 할 의무가 있어요

내가 여기서 잘못된 것을하고 있다는 것을 알고있다. 그런 구현 방법이 허용되는지 궁금하다. 컴파일러는 구현 된 인터페이스에서 메소드를 변경하라는 메시지를 표시하고 내 애플리케이션에 적용 할 수없는 것은 다른 프레임 워크에서 작동해야합니다.

모든 요소를 ​​캐스트하지 않고 동일한 인터페이스를 구현하는 다양한 구체 유형을 반환해야합니다.

+0

이것은 좋은 질문 일 수 있지만 인터페이스를 사용하는 방법을 보여주는 [mcve]와 같은 세부 정보를 제공해야합니다. 지금 서서 그 질문은 너무 모호합니다. –

+0

이 내용을 읽으면 문제를 이해할 수 있습니다. https://docs.oracle.com/javase/tutorial/java/generics/inheritance.html –

+0

예 읽고 난 후 이해합니다. 고맙습니다. –

답변

0

이> A가 B를 확장에도 불구하고, 단순히 Iterable을 넣어 당신이 X 때문에, 그것을 사용하는 방법을 < A> X < B에 의해 대용가 없습니다 < VehicleStatus은> V가 VehicleStatus을 확장의 Iterable < V>로 교체 할 수 없습니다 .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>의 서브 타입이다. Iterable<T>하지 않기 때문에

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

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

이 안전해야 :

자바 (8) 당신은 아마 무시하지 않고 새로운 방법을 추가하고 기본값으로 이전을 구현 (또는 이전 버전의 추상 클래스를 사용) 할 수 인수로 T을 취하는 모든 메소드가 있어야합니다. Java가이를 지원하지 않는다면 "공존"해야합니다. 예를 들면. List 나쁜 생각입니다!