使用通用自定义类时的 ClassCastException

我试图使用泛型构建一个简单的列表类。

但是,当我尝试打印该值时,它会抛出 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

        }

    }

}


MM们
浏览 166回答 2
2回答

慕田峪9158850

代码有一些错误。看起来,你已经错过了<>在该行vector<Integer> v = new vector();从Object[]to的演员表Integer[]永远不会成功前任:Integer[] a= (Integer[]) new Object[] {}; // 这个演员永远不会成功事实上,您只能投射Object[]到Object或Object[]。当前,当您尝试访问data该main()方法时,编译器为您放入的强制转换Integer[]将在运行时失败。您不需要data数组,只需要数组中的值,您可以通过将以下方法添加到vector类中来获取这些值。E getData(int index) {&nbsp; &nbsp; return data[index];}在这种情况下,编译器会将强制转换添加到单个元素并为您提供正确的值。

翻过高山走不出你

你真的有两个选择。要么使用类型data数组,Object[]要么创建适当的泛型数组。这是创建通用数组的方法。&nbsp;&nbsp;&nbsp;&nbsp;vector(Class<E>&nbsp;clazz)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;=&nbsp;(E[])Array.newInstance(clazz,&nbsp;MAX_LEN);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java