【发布时间】:2019-08-12 04:29:33
【问题描述】:
Java 不允许直接创建泛型数组。我知道由于擦除泛型类型在运行时未知,而数组需要在运行时进行类型检查,因此两者不兼容。
这段代码无法编译-
Holder<Integer>[] integers = new Holder<Integer>[5];
很好,但我不确定为什么这段代码实际上可以编译(带有不安全类型转换的警告)?
Holder<Integer>[] holders = new Holder[5];
holders[0] = new Holder<Integer>(5);
holders[1] = new Holder<Integer>(5);
holders[2] = new Holder<Integer>(5);
我不完全明白我实际上是通过删除菱形括号来欺骗编译器的。创建泛型数组是否可以接受?
此外,当我将此行添加到代码中时 - holders[3] = new Holder<String>("Hello");
它会引发编译错误Holder<String> can not be converted to Holder<Integer>
我觉得这很奇怪,因为据我所知,不允许泛型数组的整个想法是因为数组由于类型擦除而无法区分两种不同的泛型类型。但在这个例子中,编译器可以检测到不正确的类型转换。
我在这里错过了什么?
【问题讨论】:
-
关键是你可以写
((Holder[]) holders)[0] = new Holder<String>(""),这不会失败(这里:当你试图从holders[0]中取出Integer时它会失败)。