gpt4 book ai didi

java - 将对象数组向下转换为类型参数数组

转载 作者:行者123 更新时间:2023-12-01 17:17:42 25 4
gpt4 key购买 nike

GenericArrayCreationIsDisallowedInJava 构造函数中的语句如何工作? some1 可以解释一下吗?

public class GenericArrayCreationIsDisallowedInJava<I> {


private I[] i;


public GenericArrayCreationIsDisallowedInJava(int n)
{
i = (I[]) new Object[n];//works and prints out "Created". How?
System.out.println("Created");
}

public static void main(String[] args) {

new GenericArrayCreationIsDisallowedInJava<String>(2);

String[] strs = (String[]) new Object[2]; // throws ClassCastException. When this statement doesn't work, how is the "(I[]) new Object[n]" statement working?

}

}

最佳答案

i = (I[]) new Object[n];

尚不完全清楚您认为上面的作用,但它绝对不会做的一件事是创建一个I数组。唯一负责选择数组类型的部分位于 new 关键字之后:它是一个 Object 数组,不安全地转换为 I[].

编译器必须允许该行进行编译,因为它不知道有关 I 类型的任何信息:它也可能是 Object,因此该行是合法的。

另请注意 erased I[] 的类型是 Object[]:i 变量的实际类型(在字节码中)是 Object[] 。因此,无论实例参数化的类型是什么,分配都会在运行时成功。

只有当数组被分配回可具体化的类型时,才会抛出ClassCastException。例如:

GenericArrayCreationIsDisallowedInJava o =
new GenericArrayCreationIsDisallowedInJava<String>(2);

String[] strs = o.i; // ClassCastException thrown here

在类型删除过程中,编译器会在分配 strs 的行中插入对 String[] 的强制转换。这表明需要防止 i 在使用它的类之外“泄漏”。

关于java - 将对象数组向下转换为类型参数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20828993/

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