例如,当我有一个接口Drivable
和一个Car
实现该接口的类时。如果我用泛型类型创建一个类Garage<T extends Drivable>
,是否可以创建一个新的Garage<Car>
或者继承不适用于泛型类型,应该是Garage<Drivable>
吗?
问问题
137 次
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
。在这种情况下,由于Car
IS-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 回答