是的,从Scala 3开始,如
docs
:
Scala案例类生成应用方法,因此案例类的值可以使用简单的函数应用程序创建,而无需编写
new
.
Scala3将这个方案推广到所有具体的类。实例
class StringBuilder(s: String):
def this() = this("")
StringBuilder("abc") // old: new StringBuilder("abc")
StringBuilder() // old: new StringBuilder()
这是因为带有两个应用方法的伴随对象是与类一起生成的。对象如下所示:
object StringBuilder:
inline def apply(s: String): StringBuilder = new StringBuilder(s)
inline def apply(): StringBuilder = new StringBuilder()
合成对象StringBuilder及其应用方法称为构造函数代理。构造函数代理甚至是为Java类和来自Scala2的类生成的。具体规则如下:
-
构造函数代理伴随对象
object C
是为混凝土类创建的
C
,前提是该类还没有同伴,并且也没有其他名为的值或方法
C
在其中的范围中定义或继承
C
定义了。
-
构造函数代理
apply
为提供的具体类生成方法
-
该类具有一个伴随对象(可能已在步骤1中生成),以及
-
该伴随对象尚未定义名为的成员
申请
.
每个生成
申请
方法转发到类的一个构造函数。它具有与构造函数相同的类型和值参数。