2014-12-13 2 views
3

Я задал аналогичный вопрос в другом сообщении (How to implement a method from a derived class that does not require cast), но это немного более конкретно. Предположим, у меня есть 3 класса: автомобиль, автомобиль, кабриолет. Автомобиль расширяет автомобиль, а кабриолет расширяет автомобиль. Мне нужен метод для каждого класса, который возвращает список, который не требует приведения во время выполнения. Я считаю, что это невозможно после того, как какой-то мысли, но я также хочу услышать ваше мнениеПроблема с множественным наследованием и переопределением метода в java

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<Convertible>), но затем, если Я хотел расширить класс Convertible, я больше не мог этого делать.

Есть ли способ обойти эту ситуацию?

+0

Не могли бы вы заставить «Vehicle» принять аргумент общего типа, а затем использовать этот аргумент для типа списка? –

+2

Вам нужно бросить? Не можете ли вы просто использовать «Список 'как тип переменной, сохраняющей возвращаемое значение. – aioobe

ответ

1

Если вы хотите, чтобы иметь возможность написать

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

вы не повезло. List<Car> не является подтипом List<Vehicle>, поэтому типы возврата несовместимы. Вы можете избавиться от предупреждений компилятора, используя код, написав, например

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

Однако, я не совсем уверен, почему метод getList() должен быть унаследован. Если вы всегда знаете тип Vehicle, который вы вызываете на этом методе, вы можете также иметь отдельный метод в каждом классе, который называется getVehicleList(), getCarList() и getConvertibleList(), возвращая List<Vehicle>, a 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> { 
} 
Смежные вопросы