我会尝试将此问题视为通用(无双关语意)。
我们说我有一个对象"车库"作为汽车的容器。它看起来像这样:
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);
}
但这只会给我一个语法错误。我想有一个简单的解决方案,我只是不知道要搜索什么。希望你能帮忙。
答案 0 :(得分:3)
您可以使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
}
}
答案 1 :(得分:0)
您需要参数化整个班级。
public abstract class Garage<T extends Car> {
public abstract List<T> getCars();
public abstract void addCarToGarage(T car);
}
这也将确保您在所有方法之间使用相干类型。
编辑:拼写错误
答案 2 :(得分:0)
你基本上只想要以下内容吗?
public abstract class Garage<T extends Car> {
public abstract List<T> getCars();
public abstract void addCarToGarage(T car);
}
和
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
}
}
答案 3 :(得分:0)
当然,你只需要让车库通用:
public abstract class Garage<T extends Car> {
public abstract List<T> getCars();
public abstract void addCarToGarage(T car);
}
然后你可以做
Garage<SportsCar> sportsGarage = ....
我已经离开了类抽象,但是你可能不需要再创建子类来调整它以适应不同类型的汽车。
现在看来你至少可以通用的方式实现这两种方法。
如果您真的想要专门的子类,那么
class SportsGarage extends Garage<SportsCar> {
....
}
Garage<SportsCar> sportsGarage = new SportsGarage();