繁体   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