2014-12-13 5 views
3

다른 게시물 (How to implement a method from a derived class that does not require cast)에서 비슷한 질문을했지만 좀 더 구체적입니다. 차량, 자동차, 컨버터블의 3 가지 클래스가 있다고 가정합니다. 자동차는 차량을 확장하고 컨버터블은 자동차를 확장합니다. 런타임시 캐스트가 필요없는 목록을 반환하는 각 클래스에 대한 메서드를 원합니다. 나는 몇 가지 생각 후 불가능 할 생각하지만, 나는 또한 당신의 의견을 나는이 목록에 요소의 특정 유형을 반환 (List<Convertible>)을했을 캐스트를 사용하지하기 위해자바의 다중 상속 및 메서드 재정의 문제

public class Vehicle { 
    public List<? extends Vehicle> getList() { 
     return new ArrayList<Vehicle>(); 
    } 
} 

public class Car extends Vehicle { 
    @Override 
    public List<? extends Car> getList() { 
     return new ArrayList<Car>(); 
    } 
} 

public class Convertible extends Car { 
    @Override 
    public List<? extends Convertible> getList() { 
     return new ArrayList<Convertible>(); 
    } 
} 

하지만 만약을 듣고 싶어 나는 더 이상 그것을 할 수 없었던 컨버터블 수업을 연장하고 싶었다.

이 상황에서 어떤 방법이 있습니까? 당신이

List<Vehicle> list1 = new Vehicle().getList(); 
List<Car> list2 = new Car().getList(); 
List<Convertible> list3 = new Convertible().getList(); 

당신이 운이 있습니다를 쓸 수있게하려면

+0

'Vehicle'가 제네릭 형식 인수를 받아들이도록 강요 한 다음 그 인수를 목록 형식으로 사용 할 수 없습니까? –

+2

전송해야합니까? 그냥'List 을 확장합니다. – aioobe

답변

1

를 작성할 수 있습니다. List<Car>List<Vehicle>의 하위 유형이 아니므로 반환 유형이 호환되지 않습니다. 당신은 내가 필요 getList() 방법은 상속 할 이유를 정말 확실하지 않다, 그러나 예를

List<Car> list = new ArrayList<Car>(new Car().getList()); 

들어 서면하여 코드를 사용하여 컴파일러 경고를 제거 얻을 수 있습니다. 항상 Vehicle 유형을 알고있는 경우에는 getVehicleList(), getCarList()getConvertibleList()이라는 각 클래스에 별도의 메소드가 있고 각각 List<Vehicle>, List<Car>List<Convertible>을 반환 할 수 있습니다.

5

당신은

public class Vehicle<V extends Vehicle> { 
    public List<V> getList() { 
     return new ArrayList<V>(); 
    } 
} 

public class Car<C extends Car> extends Vehicle<C> { 
} 

public class Convertible extends Car<Covertible> { 
}