我有以下简单代码:
class GenClass<T> {
T method1(T in) {
T[] arr = (T[])new Object[10];
arr[1] = in;
return arr[1];
}
}
public class TestClass {
public static void main(String[] args) {
GenClass<Integer> cl = new GenClass<>();
System.out.println(cl.method1(1000));
Integer[] arr = (Integer[])new Object[10];
arr[1] = 1000;
System.out.println(arr[1]);
}
}
结果如下:
1000
Exception in thread "main" java.lang.ClassCastException:
[Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
at javaapplication8.TestClass.main(TestClass.java:17)
Java Result: 1
那么为什么这段代码运行良好:
T[] arr = (T[])new Object[10];
此代码抛出运行时错误:
Integer[] arr = (Integer[])new Object[10];
?
是因为类型删除吗?
如果是这样 - 运行时“T”只是在 method1 中与“Object”交换,所以源代码:
T[] arr = (T[])new Object[10];
在运行时变成如下:
Object[] arr = (Object[])new Object[10];
?
或者发生了一些不同的事情?
最佳答案
你是对的,泛型转换工作是因为类型删除:Java 编译器将其转换
T[] arr = (T[])new Object[10];
进入
Object[] arr = (Object[])new Object[10];
因此转换成功。
另一方面,非泛型转换试图将 Object
数组转换为不兼容的类型
Integer[] arr = (Integer[])new Object[10];
因此导致错误。
其余的通用代码工作正常,因为允许将 Integer
分配给 Object[]
数组。事实上,你可以在没有 Actor 的情况下做到这一点:
Object[] arr = new Object[10];
arr[1] = 1000;
关于java - 为什么代码在泛型中工作而不在非泛型类中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38740156/