java类型转换为具有泛型的子类,而超类/接口没有泛型
在下面的示例中,java类型转换为具有泛型的子类,而超类/接口没有泛型,java,oop,generics,inheritance,Java,Oop,Generics,Inheritance,在下面的示例中,车辆是用generic定义的,它实现了接口车辆,该接口的定义中没有generic。将对象分配给车辆后,将其投射回车辆时 Car-Car=(Car)carVehicle 它显示看到此警告: 未选中的分配:“com.test.Car”到“com.test.Car” 有没有办法避免这个警告 public class Main { public static void main(String[] args) { Main main = new Main(); Ve
车辆
是用generic
定义的,它实现了接口车辆
,该接口的定义中没有generic。将对象分配给车辆后,将其投射回车辆时
Car-Car=(Car)carVehicle代码>
它显示看到此警告:
未选中的分配:“com.test.Car”到“com.test.Car”
有没有办法避免这个警告
public class Main {
public static void main(String[] args) {
Main main = new Main();
Vehicle carVehicle = new Car<>(new CarModel("XM"), 100);
Car<CarModel> car = (Car) carVehicle; // Unchecked assignment: 'com.test.Car' to 'com.test.Car<com.test.CarModel>'
}
}
interface Vehicle {
long getVehicleIdNum();
}
class CarModel {
String model;
CarModel(String model) {
this.model = model;
}
}
class Car<M> implements Vehicle {
M model;
long vin;
Car(M model, long vin) {
this.model = model;
this.vin = vin;
}
@Override
public long getVehicleIdNum() {
return vin;
}
M getModel() {
return model;
}
}
公共类主{
公共静态void main(字符串[]args){
Main Main=新Main();
车辆CARVHICLE=新车(新CarModel(“XM”),100);
Car Car=(Car)carVehicle;//未选中的赋值:“com.test.Car”到“com.test.Car”
}
}
接口车辆{
long-getVehicleIdNum();
}
卡莫德尔类{
弦模型;
CarModel(弦模型){
this.model=模型;
}
}
汽车类工具车{
M模型;
长vin;
汽车(M型,长vin){
this.model=模型;
这个。vin=vin;
}
@凌驾
公共交通工具{
返回vin;
}
M getModel(){
收益模型;
}
}
您无法摆脱未经检查的强制转换警告,因为它是未经检查的强制转换。我的意思是,除了不首先将其分配给车辆
变量之外;或使变量<代码>汽车
。但是你不应该使用原始类型:演员阵容应该是(Car)
@AndyTurner谢谢。我认为这是一个完全合理的要求。假设Vehicle
接口来自一个无法更改的库,但希望以这种方式使用它。在这种情况下,无法将其分配回子类(没有此警告)似乎是一个严重的限制。即使可以修改车辆
,是否有办法以避免警告的方式对其进行设计?我敢肯定,一定有人已经无意中发现了这一点。:)无法避免未检查强制转换警告,因为您正在执行的强制转换在运行时未检查。您也许可以做一些事情来确保类型正确,例如声明一个冗余变量{CarModel cm=car.getModel();}
。这实际上将执行选中的强制转换,因此,此后您可以确保未选中的强制转换是正确的。这只是类型擦除的一个限制。