2014-10-28 66 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> {}