gpt4 book ai didi

Java 泛型 : Instantiating arrays with parameterized types: illegal?

转载 作者:行者123 更新时间:2023-11-30 07:28:27 25 4
gpt4 key购买 nike

我一定很困惑。

我到处都读到,在泛型中,参数化类型的数组是非法的。

示例来自 AngelikaLanger :

static void test() {  
Pair<Integer,Integer>[] intPairArr = new Pair<Integer,Integer>[10] ; // error
addElements(intPairArr);
Pair<Integer,Integer> pair = intPairArr[1];
Integer i = pair.getFirst();
pair.setSecond(i);
}

引自 Langer(但我读到的其他地方都说了同样的话):

The compiler prohibits creation of arrays whose component type is a concrete parameterized type, like Pair in our example. We discussed in the preceding entry why is it reasonable that the compiler qualifies a Pair[] as illegal.

到目前为止一切正常。

但在我的代码中:

private MyEntry<E> [] elements = (MyEntry<E>[])new Object[capacity];  

我正是这样做的,它编译得很好(我使用 eclipse)但是得到一个类转换异常错误(对象不能转换为 MyEntry):

我的问题是,为什么这一行首先编译?

我认为编译器不允许这种实例化。

我在这里做错了什么/不同之处?

更新:

在同一个页面,为什么我能成功:

List<E> elements[] = (List<E>[])new LinkedList[capacity];  

并且没有运行时异常

更新:

我读过的所有地方(提到 Langer 因为她经常被引用)都说编译器不允许这个声明(参数化类型的数组)。
我能理解之后会发生什么。
我不明白为什么编译器不报错。
我不是在评判,我是在说我读到的所有地方,它说这不编译。
我误读了什么吗?

更新:我在 new 部分看到了一些与缺少参数相关的评论。
这也没有问题:

List<Entry<KeyType, ValueType>> table[] = (List<Entry<KeyType, ValueType>>[])new LinkedList[capacity];

最佳答案

在您的第一个示例中,实例化没有问题 - 这正是您正在创建的内容:

new Object[capacity]

完全合法。但是,当您尝试转换时确实会遇到运行时异常,因为 Object 的数组不是 MyEntry<E> 的数组.您可能认为,如果这些通用参数化数组不存在,编译器可能会拒绝 castdeclaration,但这取决于删除的启动顺序. 不管怎样,实例化本身是没问题的。

在第二个示例中,您正在创建一个非泛型数组 LinkedList .然后,您将其分配给通用引用,该引用在运行时将被删除为 List[]。 .这很好用(因为无论对错,数组都是协变的)。

我不确定您为什么期待运行时异常;这和打电话没什么不同,比如说

List<E> = new LinkedList();

您会收到一些未经检查的警告,但不会阻止代码编译或运行。

关于Java 泛型 : Instantiating arrays with parameterized types: illegal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9214678/

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