Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java类型转换为具有泛型的子类,而超类/接口没有泛型_Java_Oop_Generics_Inheritance - Fatal编程技术网

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();}
。这实际上将执行选中的强制转换,因此,此后您可以确保未选中的强制转换是正确的。这只是类型擦除的一个限制。