2012-07-09 184 views
1

假设,我们有如下定义:什么是`object`的默认`apply`方法?

scala> trait T 
defined trait T 

scala> object A extends T 
defined module A 

然后,我们可以创建一个对象与类型T

scala> val t: T = A 
t: T = [email protected] 

没有new关键字用在这里,因此,因此在这里使用的apply方法。 但是到目前为止我们没有定义apply方法,所以我猜这里使用的默认方法是apply?但它是什么样子?

更新1:

在分配A类型具有相同的变量,错误将被抛出:

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

为什么相同的“把戏”不是在这里工作?有什么不同 ?

回答

9

Aobject,而不是class,因此您不需要创建它的一个实例 - 它基本上是一个单例。因此不需要new。此处不包含apply

这是一个与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) 
+0

谢谢。当我理解你的时候,'A'的(单例)对象已经是一个完整的对象。但在另一个示例中(请参阅Update 1),将对象'A'用作普通对象时会引发错误。这背后的原因是什么? – 2012-07-09 08:16:18

+0

@JohnThreepwood:这在技术上是一个单独的问题,但无论如何。由于'A'是一个对象(认为是singleton),所以创建它的变量或将它作为参数传递是没有意义的(参见:def foo(a:A)')。您只需使用'A'即可访问它。 – 2012-07-09 08:30:44

4

你的对象A是不是一个类型的,所以你不能在类型归属使用。

val a: T = A 

val a: A.type = A 

工作。

T是你知道的A继承的性状的扩大类型,A.type是单身人士的窄型object

+0

谢谢,现在我承诺。你知道我在哪里可以找到更多关于'A.type'的信息吗?这对我来说是新的。 – 2012-07-09 08:41:56

+0

@JohnThreepwood没什么大不了的。 'A.type'是单身类型。如果我做'val a =“abc”; val b:a.type = a',我说'b'不是简单的'String',但它实际上与'a'完全相同。有时候这很有用。如果您需要更多信息,请提出另一个问题。免费! :-) – 2012-07-09 21:12:54

相关问题