java中的多重继承和方法覆盖问题

时间:2014-12-13 20:47:34

标签: java oop design-patterns

我在另一篇文章(How to implement a method from a derived class that does not require cast)中提出了类似的问题,但这有点具体。 假设我有3个类:车辆,汽车,敞篷车。汽车延伸车辆,敞篷车延伸汽车。我想为每个类返回一个方法,该方法返回一个在运行时不需要强制转换的列表。我相信经过一番思考后不可能,但我也想听听你的意见

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类,我就不能再这样做了。

有没有解决这种情况的方法?

2 个答案:

答案 0 :(得分: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> {
}

答案 1 :(得分: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>List<Car>List<Convertible>