Java不允许直接创建通用数组。我知道由于擦除,泛型类型在运行时未知,而数组在运行时需要类型检查,因此两者是不兼容的。
这段代码无法编译-
Holder<Integer>[] integers = new Holder<Integer>[5];
Run Code Online (Sandbox Code Playgroud)
很好,但是我不确定为什么这段代码实际上会编译(警告不安全的类型转换)?
Holder<Integer>[] holders = new Holder[5];
holders[0] = new Holder<Integer>(5);
holders[1] = new Holder<Integer>(5);
holders[2] = new Holder<Integer>(5);
Run Code Online (Sandbox Code Playgroud)
我不完全了解我实际上是通过删除菱形括号来欺骗编译器的。创建通用数组是否可以接受?
此外,当我将此行添加到代码中时,holders[3] = new Holder<String>("Hello");
它引发了编译错误,Holder<String> can not be converted to Holder<Integer>
我发现这很奇怪,因为据我所知,不允许泛型数组的整个想法是因为类型擦除会导致数组无法区分两种不同的泛型类型。但是在此示例中,编译器可以检测到错误的类型转换。
我在这里想念什么?