我在另一篇文章(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类,我就不能再这样做了。
有没有解决这种情况的方法?
答案 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>
。