在java中使用泛型时的ClassCastException

在java中使用泛型时的ClassCastException,java,generics,Java,Generics,我是java编程新手,正在学习泛型。我试图自己编写一些泛型程序,但在线程“main”java.lang.ClassCastException:[Ljava.lang.Object;无法转换为[Lcom.ashwin.model.Car; 我有一辆车辆等级: public class Vehicle { private int id; private String name; private String color; private int plateNo; //

我是java编程新手,正在学习泛型。我试图自己编写一些泛型程序,但在线程“main”java.lang.ClassCastException:[Ljava.lang.Object;无法转换为[Lcom.ashwin.model.Car;

我有一辆车辆等级:

public class Vehicle {
    private int id;
    private String name;
    private String color;
    private int plateNo;
//omitted getters and setters
}
我有一辆汽车等级扩展到汽车等级

public class Car extends Vehicle {
    
    
  public Car(int id, String name, String color, int plateNo) {
      super.setId(id);
      super.setColor(color);
      super.setPlateNo(plateNo);
  }

}
我有CarDAOImpl.java课程:

public class CarDAOImpl implements VehicleDAO<Car> {

        private static ParkingLot<Car> park=new ParkingLot<Car>(10);
        
        
        @Override
        public boolean insert(Car v) {
            
            if(park.getSpace()==-1) {
                return false; 
            }
            else {
                park.setSpace(park.getSpace()-1);
                park.setVehicle(v);
                return true;
            }
        }
    
        @Override
        public boolean delete(Car k) {
            if(park.getSpace()==10) {
                return false;
            }
            else {
             boolean result=park.deleteVehicle(k);
             return result;
            }
            
        }
    
        @Override
        public Car[] getAll() {
            return park.getVehicle();
        }
    
    }
public class ParkingLot<T> {
    
    private int space;
    private T[] vehicle;
    
    public ParkingLot() {
        
    }

    public ParkingLot(int sp) {
        this.vehicle=(T[])new Object[sp];   
        this.space=sp;
    }

    public int getSpace() {
        return space;
    }

    public void setSpace(int space) {
        this.space = space;
        
    }

    public  T[] getVehicle() {
        return vehicle;
    }

    public void setVehicle(T vehicle) {
        this.vehicle[space]=vehicle;
    }
    
    public <T extends Vehicle> boolean deleteVehicle(T v) {
        for(int i=0;i<vehicle.length;i++) {
            if(((Vehicle) vehicle[i]).getId()==v.getId()) {
                vehicle[i]=null;
                return true;
            }
        }
        return false;
    }
}
例外情况是:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lcom.ashwin.model.Car;

您需要更新构造函数以将类对象包含为参数:

public ParkingLot(Class<T> clazz, int sp) {
    this.vehicle= (T[]) Array.newInstance(clazz, sp);
    this.space=sp;
}
公共停车场(等级分类,内部sp){
this.vehicle=(T[])Array.newInstance(clazz,sp);
这个空间=sp;
}
您的变量声明应该如下所示:

private static ParkingLot<Car> park = new ParkingLot<>(Car.class, 10);
私人静态停车场停车场=新停车场(汽车等级,10);

检查编译器给你的警告:数组和泛型不能很好地混合。相反,坚持使用集合(如
列表
),它会起作用。cast
(t[])
是一个不安全的类型,因此无法保证类型安全和(扰流板警报)如果没有一些重要的技巧,你就无法摆脱它。只要不要混合数组和泛型,你会过得更好。我同意使用
List
的建议,但是你不能简单地在抛出错误的函数上返回
Vehicle[]
public ParkingLot(Class<T> clazz, int sp) {
    this.vehicle= (T[]) Array.newInstance(clazz, sp);
    this.space=sp;
}
private static ParkingLot<Car> park = new ParkingLot<>(Car.class, 10);