Java中泛型类型的子类
例如,当我有一个接口Java中泛型类型的子类,java,generics,inheritance,types,interface,Java,Generics,Inheritance,Types,Interface,例如,当我有一个接口Drivable和一个实现该接口的类Car时。如果我使用泛型类型创建一个类Garage,是否可以创建一个新的Garage,或者继承不适用于泛型类型,并且应该是Garage?是的,您可以实例化Garage类型的对象,因为Car实现了所需的可驱动的接口,因此符合通用类型约束。答案取决于您希望将哪些类型的可驱动放入车库,如果您希望能够将任何类型的可驱动放入车库,则将其声明为车库。如果您只希望该特定实例包含Car实例,那么将其声明为Garage是完全可以接受的 当您创建一个类车库时,
Drivable
和一个实现该接口的类Car
时。如果我使用泛型类型创建一个类Garage
,是否可以创建一个新的Garage
,或者继承不适用于泛型类型,并且应该是Garage
?是的,您可以实例化Garage
类型的对象,因为Car
实现了所需的可驱动的接口,因此符合通用类型约束。答案取决于您希望将哪些类型的可驱动
放入车库
,如果您希望能够将任何类型的可驱动
放入车库
,则将其声明为车库
。如果您只希望该特定实例包含Car
实例,那么将其声明为Garage
是完全可以接受的 当您创建一个类车库
时,这意味着车库
可以接受实现可驱动
的类或可驱动
的子接口或实现可驱动
的子接口的类。基本上,它检查类是否是-ADrivable
。在这种情况下,由于汽车
是可驾驶的汽车
,因此您可以拥有车库
是的,可以建造车库
但是,车库
不是车库
的子类。要了解原因,请想象一下,如果是,那么将编译以下代码:
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
公共车道(摩托车、车库){
车库.停车车辆(自行车);
}
车库=新车库();
车库dgarage=车库;//实际上没有编译
摩托车b=新摩托车();
停车场(b,D区);
//我们现在车库里有一辆摩托车!
//所以后来。。。
汽车=车库。getVehicle();//在运行时抛出ClassCastException
因此,车库
不是车库
的一个实例(因为如果是这样的话,你可以向它添加一辆摩托车
,而通用类型的安全性被彻底颠覆)。相反,在我的示例中,第6行将抛出一个编译时错误。当您尝试时发生了什么?对我来说有效,我看不出问题所在。