简体   繁体   English

在 Java 中使用泛型时出现 ClassCastException

[英]ClassCastException while using generics in java

I am new to java programming and I am learning generics.I tried to do some generics program by myself and I am getting Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lcom.ashwin.model.Car;我是 Java 编程新手,正在学习泛型。我尝试自己做一些泛型程序,但Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lcom.ashwin.model.Car;遇到Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lcom.ashwin.model.Car; Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lcom.ashwin.model.Car; . .

I have a Vehicle Class:我有一个车辆类别:

public class Vehicle {
    private int id;
    private String name;
    private String color;
    private int plateNo;
//omitted getters and setters
}

I have a Car class extending Vehicle Class.我有延长汽车A级类。

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

}

I have CarDAOImpl.java class:我有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();
        }
    
    }

I have another ParkingLot.java class:我有另一个ParkingLot.java类:

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;
    }
}

My main method is:我的主要方法是:

public class Main {

    public static void main(String[] args) {
        VehicleDAO<Car> v=new CarDAOImpl();
        boolean inserted=v.insert(new Car(1,"ford","Red",1234));
        System.out.println(inserted);
        Car[] c=v.getAll();
        for(int i=0;i<c.length;i++)
        {
            System.out.println(c[i]);
        }
        }
}

I am getting error at this line of CarDAOImpl.java class:我在 CarDAOImpl.java 类的这一行出现错误:

@Override
public Car[] getAll() {
    return park.getVehicle();
}

The exception is:例外是:

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

You need to update your constructor to include the class object as a parameter:您需要更新构造函数以包含类对象作为参数:

public ParkingLot(Class<T> clazz, int sp) {
    this.vehicle= (T[]) Array.newInstance(clazz, sp);
    this.space=sp;
}

And your variable declaration should look like this:您的变量声明应如下所示:

private static ParkingLot<Car> park = new ParkingLot<>(Car.class, 10);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM