什么是`object`的默认`apply`方法?

时间:2012-07-09 07:36:20

标签: scala object apply

假设我们有以下定义:

scala> trait T
defined trait T

scala> object A extends T
defined module A

然后我们可以使用:

创建类型为T的对象
scala> val t: T = A
t: T = A$@98b13b

此处未使用new个关键字,因此此处使用apply方法。 但到目前为止我们还没有定义apply方法,所以我想这里使用默认的apply方法?但它看起来像什么?

更新1:

当使用相同的A类型赋值时,会抛出错误:

scala> val a: A = A
<console>:9: error: not found: type A
       val a: A = A
              ^

为什么同样的'技巧'在这里不起作用?有什么区别?

2 个答案:

答案 0 :(得分:9)

Aobject,而不是class,因此您无需创建它的实例 - 它基本上是一个单例。因此,不需要newapply未在此处发布。

case class es:

有点不同
case class C(x: Int)
val c = C(10)

这次new运算符也没有被使用,但是创建了新对象 - 这次涉及apply()。基本上,当您创建case class时,会创建随播对象,并为您提供apply方法(请参阅:Using constructor where function expected):

val c = C.apply(10)

答案 1 :(得分:4)

您的对象A不是类型,因此您无法在类型归属中使用它。

val a: T = A

val a: A.type = A

的工作。

T是您知道A继承的特性的扩大类型,A.type是单身object的狭窄类型。