2014-10-28 48 views
-4

我目前正试图扩大一个更大的项目。项目中有些东西是给出的,我有几个问题可以使我的扩展类型安全。如何用泛型实现类型安全?

我将使示例代码更一般。

public abstract class Garage { 

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

抽象类Garage给出并且有从Garage延伸几个给定的类。像SportCarGarageSUVCarGarage。这些车库在某些方面表现不同。但当然每个车库都有parkCars功能。 Car也有一些不同的孩子,如SportsCar,SUVCar等,这些也给出了。

现在我想我只能将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功能!

编辑:

我想我的例子是错误的,这就是它不会与我实际工作的代码工作的原因。感谢您的帮助...

+2

为什么你不按照@kocko给出的建议[你以前的问题](http://stackoverflow.com/a/26507271/1225328)?因为这实际上是你需要的设计...... – sp00m 2014-10-28 08:49:57

+0

你说你正在扩大一个更大的项目。这是否意味着你无法修改Garage类? – 2014-10-28 08:55:42

+0

@ sp00m:如果我理解正确,kockos示例仍然有一个抽象的“parkCars”。我认为应该有一种方式,而不是在每一个小类中覆盖它。 – Feroc 2014-10-28 08:56:36

回答

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); //不应该工作,但是。 :(

重构后,它给出了一个编译器错误!

+0

这是我目前的做法。我的希望是,从Garage延伸出来的每一堂课都可以不用重写parkCars。 – Feroc 2014-10-28 08:59:06

+1

您不必重写SportsCarGarage中的parkCars方法即可运行。 – 2014-10-28 09:00:57

+0

你不需要。这只是一个例子。 – 2014-10-28 09:09:40

1

你在类的类型和方法的类型parkCars是不同的, 使它工作,你需要你的界面更改为

public abstract class Garage<T extends Car> { 

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

现在你SportsCarGarage只接受跑车

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