泛型类型作为抽象方法的参数?

Fer*_*roc 0 java generics

我会尽量问这个问题的通用性(没有双关语)。

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

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)

但这只会给我一个语法错误。我想有一个简单的解决方案,我只是不知道要搜索什么。希望你能帮忙。

Kon*_*kov 5

您可以GarageaddCarToGarage方法中创建泛型并重用类型:

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)