1

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

4

4 回答 4

2

答案取决于你想把什么类型Drivable放入Garage'如果你想能够把任何类型Drivable放入 中Garage,那么将其声明为Garage<Drivable>. 如果您只希望该特定实例包含Car将其声明为完全可以接受的实例Garage<Car>

于 2013-05-08T14:47:23.157 回答
1

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

于 2013-05-08T15:02:49.470 回答
0

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

于 2013-05-08T14:45:07.960 回答
0

是的,可以制作一个Garage<Car>.

但是, aGarage<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

出于这个原因, aGarage<Car>不是实例Garage<Drivable>(因为如果是,您可以将 a 添加Motorbike到它,并且泛型类型安全被完全颠覆)。相反,在我的示例中,将在第 6 行引发编译时错误。

于 2013-05-08T15:15:57.017 回答