使用通用自定义类时的ClassCastException

时间:2018-10-26 23:49:44

标签: java

我试图使用泛型构造一个简单的列表类。
但是,当我尝试打印该值时,它将引发classcastexception。声明和初始化通用数组时有什么问题吗?

class vector<E> {
    static int MAX_LEN = 1234567;
    E[] data;
    int[] prv;
    int to;
    int size;

    vector() {
        data = (E[])new Object[MAX_LEN];
        prv = new int[MAX_LEN];
        to = -1;
        size = 0;

        for(int i = 0; i < MAX_LEN; ++i) {
            prv[i] = -1;
        }
    }

    void push_back(E e) {
        data[size] = e;
        prv[size] = to;
        to = size;
        ++size;
    }
}

public class Main {

    public static void main(String[] args) throws Exception {
        vector<Integer> v = new vector();
        v.push_back(1);
        v.push_back(2);
        v.push_back(3);
        v.push_back(4);
        v.push_back(5);

        for(int i = v.to; i != -1; i = v.prv[i]) {
            System.out.println(v.data[i]); //<- Exception here
        }
    }
}

2 个答案:

答案 0 :(得分:1)

代码有些错误。

  1. 您似乎错过了<>行中的vector<Integer> v = new vector();
  2. Object[]Integer[]的投射将永远不会成功

例如:

  

Integer [] a =(Integer [])new Object [] {}; //此强制转换永远不会成功

事实上,您只能将Object[]投射到ObjectObject[]

当前,当您尝试使用data方法访问main()时,编译器为您Integer[]进行的强制转换将在运行时失败。您不需要data数组,只需要其中的值,可以通过将以下方法添加到vector类中来获得。

E getData(int index) {
    return data[index];
}

在这种情况下,编译器会将强制类型转换添加到各个元素中,并为您提供正确的值。

答案 1 :(得分:1)

您这里确实有两个选择。使用data类型的Object[]数组或创建适当的通用数组。这是创建通用数组的方法。

    vector(Class<E> clazz) {
        data = (E[])Array.newInstance(clazz, MAX_LEN);