Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用泛型自定义类时的ClassCastException_Java - Fatal编程技术网

Java 使用泛型自定义类时的ClassCastException

Java 使用泛型自定义类时的ClassCastException,java,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];

我试图使用泛型构造一个简单的列表类。
然而,当我试图打印出值时,它抛出了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
        }
    }
}
类向量{
静态int MAX_LEN=1234567;
E[]数据;
int[]prv;
int到;
整数大小;
向量(){
数据=(E[])新对象[MAX_LEN];
prv=新整数[MAX_LEN];
to=-1;
尺寸=0;
对于(int i=0;iSystem.out.println(v.data[i]);//代码有一些地方出错

  • 看起来,您在
    vector v=new vector();
  • Object[]
    Integer[]
    的强制转换将永远不会成功
  • 例:

    整数[]a=(整数[])新对象[]{};//此强制转换将永远不会成功

    实际上,您只能将
    Object[]
    强制转换为
    Object
    Object[]

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

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

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

    代码有一些地方出错

  • 看起来,您在
    vector v=new vector();
  • Object[]
    Integer[]
    的强制转换将永远不会成功
  • 例:

    整数[]a=(整数[])新对象[]{};//此强制转换将永远不会成功

    实际上,您只能将
    Object[]
    强制转换为
    Object
    Object[]

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

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

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

    这里确实有两个选项。可以使用
    对象[]
    类型的
    数组,也可以创建适当的泛型数组。下面是如何创建泛型数组

        vector(Class<E> clazz) {
            data = (E[])Array.newInstance(clazz, MAX_LEN);
    
    向量(类clazz){
    data=(E[])Array.newInstance(clazz,MAX_LEN);
    
    这里确实有两个选项。使用
    对象[]
    类型的
    数据
    数组或创建适当的泛型数组。下面是如何创建泛型数组

        vector(Class<E> clazz) {
            data = (E[])Array.newInstance(clazz, MAX_LEN);
    
    向量(类clazz){
    data=(E[])Array.newInstance(clazz,MAX_LEN);
    
    您阅读了吗?我检查了您的链接,我认为它不相关,因为它会引发异常,而不是打印对象的地址。但奇怪的是,我在类中添加了一个简单的getter方法后得到了正确的结果。仍然很困惑。您阅读了吗?我检查了您的链接,我认为它不相关,因为它会引发异常n而不是打印对象的地址。但奇怪的是,我在类上添加了一个简单的getter方法后得到了正确的结果。仍然感到困惑。将泛型类型数组转换为对象数组是不可能的,但是将泛型类转换为对象是可以的。对吗?转换为
    对象
    将始终成功,因为它是all.Ex:
    Object a=(Object)new Object[]{};
    将泛型类型数组转换为Object数组是不可能的,但是将泛型类转换为Object是可以的。对吗?转换为
    Object
    将始终成功,因为它是所有对象的超级类型。Ex:
    Object a=(Object)new Object[]{};