当我有一个接口Drivable
和一个实现该接口的类Car
时。如果我创建一个具有泛型类型Garage<T extends Drivable>
的类,是否可以创建一个新的Garage<Car>
或继承不适用于泛型类型,它应该是Garage<Drivable>
吗?
答案 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行将抛出编译时错误。