[英]Subclasses of generic types in Java
當我有一個接口Drivable
和一個實現該接口的類Car
。 如果我使用泛型類型Garage<T extends Drivable>
創建一個類,是否可以創建一個新的Garage<Car>
或繼承不適用於泛型類型,它應該是Garage<Drivable>
嗎?
答案取決於什么類型的Drivable
要放進Garage
“如果你希望能夠把任何類型的Drivable
進Garage
,然后把它聲明為Garage<Drivable>
。 如果您只希望該特定實例包含Car
實例,則將其聲明為Garage<Car>
是完全可以接受的。
當創建類Garage<T extends Drivable>
,則意味着Garage
可以接受它實現類Drivable
的或子接口Drivable
或實現的子接口的類Drivable
。 基本上,它檢查類IS-A是否可Drivable
。 在這種情況下,由於Car
IS-A Drivable
,您可以擁有Garage<Car>
。
是的,您可以實例化Garage<Car>
類型的對象,因為Car
實現了所需的Drivable
接口,因此符合泛型類型約束。
是的,可以制作Garage<Car>
。
但是, Garage<Car>
不是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<Car>
不是 Garage<Drivable>
一個實例(因為如果它可以為它添加Motorbike
,並且通用類型的安全性完全被顛覆)。 相反,在我的示例中,第6行將拋出編譯時錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.