2013-05-08 66 views
1

当我有例如一个接口Drivable和一个实现该接口的类Car。如果我使用泛型类型Garage<T extends Drivable>创建类,是否有可能创建新的或继承不适用于泛型类型,并且它应该是Garage<Drivable>Java中通用类型的子类

+2

当你尝试过什么? – 2013-05-08 14:38:09

+1

适合我,我没有看到问题。 – stealthjong 2013-05-08 14:41:31

回答

2

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

0

是的,你可以实例类型的对象,因为Car实现了所需Drivable接口,因此满足泛型类型约束。

1

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

0

是的,可以制作。然而,不是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<Drivable>实例(因为如果它是你可以添加一个Motorbike它,并且泛型类型安全性被完全颠覆)。相反,在我的例子中,第6行会出现编译时错误。