java - 为什么泛型数组中的setter方法起作用(JAVA)?

标签 java arrays generics getter setter

基本上,为什么我们可以使用 setter 方法在类内分配泛型数组的值,但是每当我们尝试在泛型类之外访问它时它会引发运行时错误?

class Demo<T>{
    T d[]=(T[])new Object[3];
    T x;
    int l=0;
    void setD(T x){
        d[l++]=x; //Why does this work?
    }
    void getD(int x){
        System.out.println(d[x]); //Why does this work too? as i cant print in main class directly
    }

}

public class Main<T> {

    public static void main(String[] args) {

        Demo<Integer> de=new Demo<>();
        de.x=7; //This doesnt throw any error

        //de.d[0]=3; //This throws runtime error. Runtime error is given below.. I understand why this doesn't work 
//but i wanted to know why does that setter method work as this line of code seems similar to that of setter method
        de.setD(3);

        de.getD(0);

    }
}
线程“main”中的异常 java.lang.ClassCastException: 类 [Ljava.lang.Object;不能转换为类 [Ljava.lang.Integer; ([Ljava.lang.Object; 和 [Ljava.lang.Integer; 位于加载程序“bootstrap”的模块 java.base 中)
在 com.company.Main.main(Main.java:34)

为什么会这样?

最佳答案

我认为这是因为类型删除。看看这条线。

Demo<Integer> de=new Demo<>();
de.d[0]=3; //java knows, that de.d should be Integer[], but it actually is Object[]
这里,因为指定了泛型参数,java 期望 de.d 是整数 []。但它实际上是 Object[]。而java试图将对象数组视为整数数组。
为此,java 必须将 Object[] 转换为 Integer[] 。它抛出一个异常。
如果您执行以下操作,则会引发相同的异常
Integer[] ints = (Integer[])new Object[10];
在你的类里面应用类型删除。因此,java 在运行时将 T 视为对象。所以这个方法
T d[]=(T[])new Object[3];
void setD(T x){
    d[l++]=x; //Why does this work?
}
将一个 x,即 Object 放到 Objects 数组中。将 Integer 转换为 Object 没有问题,也无需将 Object[] 转换为 Integer[] 。所以,一切正常。
方法中的代码等价于以下
Object d[]= (Object[])new Object[3];
void setD(Object x){
    d[l++]=x; // x is Integer here
}

关于java - 为什么泛型数组中的setter方法起作用(JAVA)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67501553/

相关文章:

java - 如何在selenium中找到具有相同名称和相同属性的元素并插入一些文本

java - getClass().getClassLoader().getResource() 和 getClass.getResource() 的区别?

c++ - 概念指针数组

javascript - 如何检查数组中给出名称的所有字段是否为非空?

c++ - 通用类型的 is_base_of

.net - 通用约束是否应该优先于使用接口(interface)作为参数类型?

java - ASP.NET/IIS 相当于 Java/WAS 上下文根

java - ManyToOne 可选关系上的 JPA Criteria API

php - 生成器和数组有什么区别?

java - 取消选中返回类类型的转换