我有以下简单的代码:
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];
吗
是否因为类型擦除?
如果是的话 - 是&#34; T&#34;在运行时刚与&#34;对象&#34;交换在method1中,所以源代码:
T[] arr = (T[])new Object[10];
在运行时成为以下内容:
Object[] arr = (Object[])new Object[10];
或者有什么不同之处?
答案 0 :(得分:3)
你是正确的,因为类型擦除,通用转换工作:Java编译器转为此
T[] arr = (T[])new Object[10];
到
Object[] arr = (Object[])new Object[10];
所以演员成功了。
另一方面,非泛型转换尝试将Object
的数组转换为不兼容的类型
Integer[] arr = (Integer[])new Object[10];
因此导致错误。
其他通用代码工作正常,因为允许将Integer
分配到Object[]
数组中。事实上,你可以在没有演员的情况下做到这一点:
Object[] arr = new Object[10];
arr[1] = 1000;