如何用泛型实现类型安全?

时间:2014-10-28 08:46:41

标签: java generics type-safety

我目前正在尝试扩展一个更大的项目。给出了项目中的一些内容,我遇到了一些问题,使我的扩展类型安全。

我将使示例代码更加通用。

public abstract class Garage {

    public <T extends Car> void parkCars(T... car){
        // add cars to a list
    }
}

给出了抽象类Garage,并且有几个给定的类从Garage扩展而来。与SportCarGarageSUVCarGarage一样。那些车库在某些方面表现不同。但当然每个车库都有parkCars功能。 Car也有一些不同的孩子,例如SportsCarSUVCar等。这些也是。

现在我希望我只能将SportCars暂停SportCarGarage

我希望它会起到这样的作用:

public class SportsCarGarage<T extends SportsCar> extends Garage {

}

...

    SportsCarGarage<SportsCar> sportsCarGarage = new SportsCarGarage();
    // Would be great if I could do this without adding <SportsCar>

    SUVCar bmwX5 = new SUVCar();
    SportsCar porsche911 = new SportsCar();

    sportsCarGarage.parkCars(porsche911); // works!
    sportsCarGarage.parkCars(bmwX5); // shouldn't work, but does. :(

我想我的语法错误了。但是应该有办法阻止其他开发人员将汽车停放在错误类型的车库中而不必覆盖每种类型车库中的parkCars功能!?

编辑:

我想我的例子是错的,这就是它无法使用我实际工作的代码的原因。谢谢你的帮助...

3 个答案:

答案 0 :(得分:1)

这有帮助吗?

public abstract class Garage<T extends Car> {

    public void parkCars(T... car) {
        // add cars to a list
    }
}

public class SportsCarGarage extends Garage<SportsCar> {
}
  

sportsCarGarage.parkCars(BMWX5); //不应该工作,但确实如此。 :(

重构后,它会产生编译错误!

答案 1 :(得分:1)

您在班级中的类型和方法parkCars中的类型不同, 要使其工作,您需要将界面更改为

public abstract class Garage<T extends Car> {

    public  void parkCars(T... car){
        // add cars to a list
    }
}

现在您的SportsCarGarage只会接受跑车

答案 2 :(得分:0)

如果它只是通用的parkCars实现,那么它就是:

public abstract class Garage<T extends Car> {

    public List<T> parkedCars = new ArrayList<>();

    public void parkCars(T... cars) {
        Collections.addAll(parkedCars, cars);
    }
}

public class SportsCarGarage extends Garage<SportsCar> {}