有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    您是对的,泛型转换之所以有效是因为类型擦除: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;