2013-05-08 64 views
1

當我有例如一個接口Drivable和一個實現該接口的類Car。如果我使用泛型類型Garage<T extends Drivable>創建類,是否有可能創建新的或繼承不適用於泛型類型,並且它應該是Garage<Drivable>Java中通用類型的子類

+2

當你嘗試過什麼? – 2013-05-08 14:38:09

+1

適合我,我沒有看到問題。 – stealthjong 2013-05-08 14:41:31

回答

2

答案取決於你想放進Garage'如果你希望能夠把任何類型的DrivableGarage,然後把它聲明爲Garage<Drivable>什麼類型的Drivable。如果您只希望該特定實例包含Car實例,則將其聲明爲是完全可以接受的。

0

是的,你可以實例類型的對象,因爲Car實現了所需Drivable接口,因此滿足泛型類型約束。

1

當你創建一個類Garage<T extends Drivable>,這意味着Garage可以接受它實現的DrivableDrivable或子接口或實現的Drivable子接口類的類。基本上,它會檢查班級IS-A Drivable。在這種情況下,由於Car IS-A Drivable,您可以有。

0

是的,可以製作。然而,不是Garage<Drivable>的子類。要知道爲什麼,試想如果是 - 然後將下面的代碼將編譯:

public void putBikeAway(Motorbike bike, Garage<Driveable> garage) { 
    garage.parkVehicle(bike); 
} 

Garage<Car> garage = new Garage<Car>(); 
Garage<Drivable> dgarage = garage; // doesn't compile in reality 
Motorbike b = new Motorbike(); 
putBikeAway(b, dgarage); 
// We now have a Motorbike in a Garage<Car>! 

// So later on... 
Car car = garage.getVehicle(); // throws ClassCastException at runtime 

出於這個原因,是Garage<Drivable>實例(因爲如果它是你可以添加一個Motorbike它,並且泛型類型安全性被完全顛覆)。相反,在我的例子中,第6行會出現編譯時錯誤。