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
是完全可以接受的

当您创建一个类
车库
时,这意味着
车库
可以接受实现
可驱动
的类或
可驱动
的子接口或实现
可驱动
的子接口的类。基本上,它检查类是否是-A
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
公共车道(摩托车、车库){
车库.停车车辆(自行车);
}
车库=新车库();
车库dgarage=车库;//实际上没有编译
摩托车b=新摩托车();
停车场(b,D区);
//我们现在车库里有一辆摩托车!
//所以后来。。。
汽车=车库。getVehicle();//在运行时抛出ClassCastException

因此,
车库
不是
车库
的一个实例(因为如果是这样的话,你可以向它添加一辆
摩托车
,而通用类型的安全性被彻底颠覆)。相反,在我的示例中,第6行将抛出一个编译时错误。

当您尝试时发生了什么?对我来说有效,我看不出问题所在。