java - 直接访问通用数组不起作用

标签 java arrays generics

我想知道如何在构造函数中初始化通用数组。

在google上搜索后,我写了下面的代码。

public class Test<E>{
    private E[] mData;

    public Test(){
        mData = (E[])new Object[100];
    }

    public void put(E data, int index){
        mData[index]=data;
    }

    public E get(int index){
        return mData[index];
    }

    public static void main(String[] args){
        Test<Integer> t1 = new Test<>();
        t1.put(100, 0);
        System.out.println(t1.get(0)); // 100
    }
}

上述代码的输出预计为 100,但如果我直接访问通用数组,则会出现错误。

代码如下所示。

public class Test<E>{
    private E[] mData;

    public Test(){
        mData = (E[])new Object[100];
    }

    public static void main(String[] args){
        Test<Integer> t1 = new Test<>();
        t1.mData[0] = 100;
        System.out.println(t1.mData[0]);
        // java.lang.ClassCastException error
    }
}

上面的代码只是给了我一个 ClassCastException错误。

我不知道我上传的这些代码有什么区别。

任何帮助都将不胜感激。

最佳答案

这里重要的是,mData 的类型始终是 Object[],即使它伪装成 E[]

在您的第一个示例中,在幕后发生以下情况:

    public E get(int index){
        Object x = mData[index];
        E result = (E) x;
        return result;
    }

但是在第二个示例中,

// ClassCast
Integer[] tempArray = t1.mData;
System.out.println(tempArray[0]);

如果您确实希望数组的类型为 E[],请使用 Array.newInstance(),但这确实会给构造函数引入不必要的参数。

您的方法更加用户友好(例如,ArrayList 执行相同的操作),只需确保不直接公开底层数组即可。

关于java - 直接访问通用数组不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58130787/

相关文章:

java - 延迟 Kafka Streams 消费

java - 单击 RadioButton 会使应用程序崩溃

java - 错误: Type 'int[]' of field is not supported | how to add integer list to Realm?

c# - Swagger 可以生成自定义泛型类型吗?

java - 如何在java 8中比较对象列表与长列表

ios - 在 ios swift 中将 firebase 数据添加到数组

javascript - 我想从 JavaScript 对象列表中获取关联数组

arrays - ruby ,传统知识库。 getopenfile 的输出

c# - 泛型类型参数的多个约束的优先级

java - 在 java 中返回具有具体实现的通用接口(interface)