为什么代码在泛型中工作而在非泛型类中不起作用?

时间:2016-08-03 09:51:06

标签: java generics

我有以下简单的代码:

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];

或者有什么不同之处?

1 个答案:

答案 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;