[英]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.