1

数组创建是否发生在编译时?

List<String>[] strings = new List[9];

即使 List 只是一个接口,它也可以工作,所以我猜数组创建发生在类型擦除之前。这就是为什么以下方法不起作用:

   List<String>[] strings = new List<String>[9];

是因为数组本身的创建发生在类型擦除之前吗?

4

4 回答 4

6

数组是在运行时创建的,在类型擦除之后。newarray字节码指令保留用于创建数组。

由于 Java 中的数组仅包含对象引用,而不包含具体对象,因此您可以创建接口和抽象类的数组。没有创建实例来填充数组。

至于为什么不能创建参数化类型的数组,原因是数组不是类型安全的,如教程中所述

于 2013-09-05T12:50:27.327 回答
0

根据JLS -

在 Java 编程语言中,数组是对象(第 4.3.1 节),是动态创建的,并且可以分配给 Object 类型的变量(第 4.3.2 节)。

数组创建表达式

new PrimitiveType DimExprs Dimsopt
new ClassOrInterfaceType DimExprs Dimsopt
new PrimitiveType Dims ArrayInitializer 
new ClassOrInterfaceType Dims ArrayInitializer
于 2013-09-05T12:58:33.697 回答
0

不,数组是在运行时创建的。第一个片段的工作方式与原始类型一样List<String> strings = new ArrayList()- 为了向后兼容,原始类型是合法的,只是不鼓励。第二个不起作用,因为数组和泛型不能很好地混合。你可以在这里了解整个故事

于 2013-09-05T12:55:48.103 回答
0

数组是在运行时创建的。您只是在创建一个包含List<String>并且没有创建实际对象的数组List<String>。所以它是完全有效的。

数组创建表达式的运行时求值JLS数组创建表达式在运行时求值。

于 2013-09-05T12:53:39.433 回答