我会尽量问这个问题的通用性(没有双关语)。
假设我有一个用作汽车容器的对象“车库”。它看起来像这样:
public abstract class Garage {
public abstract List<? extends Car> getCars();
public abstract void addCarToGarage(Car car);
}
Run Code Online (Sandbox Code Playgroud)
因为我很有钱,我会有不同类型的车库,有的只有我的跑车,有的只有我的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
}
}
Run Code Online (Sandbox Code Playgroud)
现在你可能已经看到我的问题了。我可以实现,getCars()以便它返回一个列表SportCar。但是如果我打电话addCarToGarage,我需要检查每辆车的类型,如果有人试图在我的 SportCarGarage 中添加 SUV,我不会收到语法错误。
我想要这样的东西:
public abstract class Garage {
public abstract List<? extends Car> getCars();
public abstract void addCarToGarage(? extends Car car);
}
Run Code Online (Sandbox Code Playgroud)
但这只会给我一个语法错误。我想有一个简单的解决方案,我只是不知道要搜索什么。希望你能帮忙。
您可以Garage在addCarToGarage方法中创建泛型并重用类型:
public abstract class Garage<T extends Car> {
public abstract List<T> getCars();
public abstract void addCarToGarage(T car);
}
Run Code Online (Sandbox Code Playgroud)
然后,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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3672 次 |
| 最近记录: |