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

时间:2014-10-22 12:13:12

标签: java generics

我会尝试将此问题视为通用(无双关语意)。

我们说我有一个对象"车库"作为汽车的容器。它看起来像这样:

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

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

4 个答案:

答案 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();