我将尝试以尽可能通用的方式(无双关语)问这个问题。

假设我有一个对象“车库”,可以用作汽车的容器。看起来像这样:

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
    }
}

07-25 22:19