java为什么代码在泛型类中工作而不在非泛型类中工作?
我有以下简单的代码:
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];
?
或者什么不同的东西是庚烷
# 1 楼答案
您是对的,泛型转换之所以有效是因为类型擦除:Java编译器将此转换为
进入
所以演员阵容成功了
另一方面,非泛型强制转换尝试将
Object
数组强制转换为不兼容的类型从而导致错误
其余的通用代码工作正常,因为允许将
Integer
赋值到Object[]
数组中。事实上,你不需要演员阵容就可以做到: