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

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

?

是因为类型删除吗?

如果是这样 - 运行时“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/

相关文章:

Scala 解决 Comparator.thenComparing 中的错误覆盖

Scala:F-Bounded Polymorphism Woes

java - 如何在 Java 中有效地舍入(floor)整数?

java - java 中的可变参数和泛型

java - 如何区分可搜索的 pdf 和不可搜索的 pdf?

java - 通用使用 2 个相同的类但来自不同的包

java - java 中的十进制到二进制 - 我的代码有什么问题?

java - 在 SurfaceView 的这个简短示例中,哪个线程被阻塞等待线程 join() 完成?

generics - Guice 类型 Kotlin 中的字面量

java - Mockito.any() 匹配泛型类型 T 的任何实例