创建数组编译时间?

时间:2013-09-05 12:47:53

标签: java arrays

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

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

即使List只是一个接口,它仍然有效,所以我猜数组创建发生在类型erasue之前。 这就是为什么以下不起作用的原因:

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

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

4 个答案:

答案 0 :(得分:6)

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

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

至于为什么你不能创建参数化类型的数组,原因是数组不是类型安全的,as explained in the tutorial

答案 1 :(得分:0)

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

Run-time Evaluation of Array Creation Expressions JLS数组创建表达式在运行时进行评估。

答案 2 :(得分:0)

不,数组是在运行时创建的。第一个代码片段就像List<String> strings = new ArrayList()一样 - 为了向后兼容性,原始类型是合法的,仅仅是不鼓励。第二个不起作用,因为数组和泛型不能很好地混合。你可以拥有整个故事here

答案 3 :(得分:0)

根据JLS -

  

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

<强> ArrayCreationExpression

new PrimitiveType DimExprs Dimsopt
new ClassOrInterfaceType DimExprs Dimsopt
new PrimitiveType Dims ArrayInitializer 
new ClassOrInterfaceType Dims ArrayInitializer