数组创建是否在编译时发生?
List<String>[] strings = new List[9];
即使List只是一个接口,它仍然有效,所以我猜数组创建发生在类型erasue之前。 这就是为什么以下不起作用的原因:
List<String>[] strings = new List<String>[9];
这是因为数组本身的创建发生在类型擦除之前吗?
答案 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