数组创建是否发生在编译时?
List<String>[] strings = new List[9];
即使 List 只是一个接口,它也可以工作,所以我猜数组创建发生在类型擦除之前。这就是为什么以下方法不起作用:
List<String>[] strings = new List<String>[9];
是因为数组本身的创建发生在类型擦除之前吗?
数组是在运行时创建的,在类型擦除之后。newarray
字节码指令保留用于创建数组。
由于 Java 中的数组仅包含对象引用,而不包含具体对象,因此您可以创建接口和抽象类的数组。没有创建实例来填充数组。
至于为什么不能创建参数化类型的数组,原因是数组不是类型安全的,如教程中所述。
不,数组是在运行时创建的。第一个片段的工作方式与原始类型一样List<String> strings = new ArrayList()
- 为了向后兼容,原始类型是合法的,只是不鼓励。第二个不起作用,因为数组和泛型不能很好地混合。你可以在这里了解整个故事
数组是在运行时创建的。您只是在创建一个包含List<String>
并且没有创建实际对象的数组List<String>
。所以它是完全有效的。
数组创建表达式的运行时求值JLS数组创建表达式在运行时求值。