簡體   English   中英

Java中泛型類的子類

[英]Subclasses of generic types in Java

當我有一個接口Drivable和一個實現該接口的類Car 如果我使用泛型類型Garage<T extends Drivable>創建一個類,是否可以創建一個新的Garage<Car>或繼承不適用於泛型類型,它應該是Garage<Drivable>嗎?

答案取決於什么類型的Drivable要放進Garage “如果你希望能夠把任何類型的DrivableGarage ,然后把它聲明為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM