基本上,为什么我们可以使用 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/