gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:37:48 26 4
gpt4 key购买 nike

我有以下简单代码:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com