Java中泛型类的子类

时间:2013-05-08 14:36:45

标签: java generics inheritance types interface

当我有一个接口Drivable和一个实现该接口的类Car时。如果我创建一个具有泛型类型Garage<T extends Drivable>的类,是否可以创建一个新的Garage<Car>或继承不适用于泛型类型,它应该是Garage<Drivable>吗?

4 个答案:

答案 0 :(得分:2)

答案取决于您要将Drivable放入Garage的类型{1}}如果您希望能够将任何类型的Drivable放入Garage ,然后将其声明为Garage<Drivable>。如果您只希望该特定实例包含Car个实例,则将其声明为Garage<Car>是完全可以接受的。

答案 1 :(得分:1)

当您创建类Garage<T extends Drivable>时,这意味着Garage可以接受实现Drivable的类或Drivable的子接口或实现子接口的类。 Drivable。基本上,它会检查类IS-A Drivable。在这种情况下,由于Car IS-A Drivable,您可以拥有Garage<Car>

答案 2 :(得分:0)

是的,您可以实例化Garage<Car>类型的对象,因为Car实现了所需的Drivable接口,因此符合泛型类型约束。

答案 3 :(得分:0)

是的,可以制作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行将抛出编译时错误。