我将尝试以尽可能通用的方式(无双关语)问这个问题。
假设我有一个对象“车库”,可以用作汽车的容器。看起来像这样:
public abstract class Garage {
public abstract List<? extends Car> getCars();
public abstract void addCarToGarage(Car car);
}
因为我非常有钱,所以我会有不同类型的车库,有些只包含我的跑车,另外一些只包含我的SUV等等。
因此,我的一个车库将如下所示:
public class SportCarGarage extends Garage {
@Override
public List<SportCar> getCars() {
// code to return the cards
}
@Override
public void addCarToGarage(Car car){
// code to add car to garage
}
}
现在您可能已经看到我的问题了。我可以实现
getCars()
,以便它返回SportCar
的列表。但是,如果我调用addCarToGarage
,则需要检查每辆汽车的类型,如果有人尝试在SportCarGarage中添加SUV,则不会出现语法错误。我想要这样的东西:
public abstract class Garage {
public abstract List<? extends Car> getCars();
public abstract void addCarToGarage(? extends Car car);
}
但这只会给我一个语法错误。我想有一个简单的解决方案,我只是不知道要搜索什么。希望能对您有所帮助。
最佳答案
您可以使Garage
通用并在addCarToGarage
方法中重复使用该类型:
public abstract class Garage<T extends Car> {
public abstract List<T> getCars();
public abstract void addCarToGarage(T car);
}
然后,
SportCarGarage
将如下所示:public class SportCarGarage extends Garage<SportCar> {
@Override
public List<SportCar> getCars() {
// code to return the cards
}
@Override
public void addCarToGarage(SportCar car){
// code to add car to garage
}
}