【发布时间】:2012-03-17 04:48:17
【问题描述】:
如果 List(1,2,3) 转换为 List.apply(1,2,3) 那么为什么 new Array[String](3) 不转换为 new Array[String].apply(3)?
我尝试了 Array.apply(3),但语义与 new Array[String](3) 不同。
【问题讨论】:
如果 List(1,2,3) 转换为 List.apply(1,2,3) 那么为什么 new Array[String](3) 不转换为 new Array[String].apply(3)?
我尝试了 Array.apply(3),但语义与 new Array[String](3) 不同。
【问题讨论】:
当您调用 new Array[String](3) 时,您正在使用单个参数调用 Array class 上的 Array 构造函数: 3. 或者,当您调用 Array(3) 时,您正在调用 Array object 上的 apply 方法。在 Java 中,这称为静态方法调用。和你想的一样,调用Array.apply(3)。
【讨论】:
使用new 表示该机制不是函数应用,而是构造。代码“翻译”为分配内存和调用构造函数。
【讨论】:
new 的情况下创建对象,其中许多您甚至都不会注意到(函数文字、扩充类等)。您可以调用一些为您创建对象的工厂方法(可能最终使用new)。您可以使用反射 (classOf[Foo].newInstance)。如果你真的很热衷,你可以操纵字节码......
注意两者的区别
val a = new Array(3)
和
val a = Array(3)
第一个创建一个新的Array 对象,其中包含3 个null 元素;第二个使用一个元素创建一个新的 Array 对象,即 3。
Array(3) 转换为 Array.apply(3),与 List(3) 转换为 List.apply(3) 的方式完全相同。
【讨论】: