为了账号安全,请及时绑定邮箱和手机立即绑定

使用通用自定义类时的 ClassCastException

使用通用自定义类时的 ClassCastException

MM们 2021-12-10 14:57:22
我试图使用泛型构建一个简单的列表类。但是,当我尝试打印该值时,它会抛出 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 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

代码有一些错误。


看起来,你已经错过了<>在该行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) {

    return data[index];

}

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


查看完整回答
反对 回复 2021-12-10
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

你真的有两个选择。要么使用类型data数组,Object[]要么创建适当的泛型数组。这是创建通用数组的方法。

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


查看完整回答
反对 回复 2021-12-10
  • 2 回答
  • 0 关注
  • 165 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号