1

假设我们有以下定义:

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
              ^

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

4

2 回答 2

9

A是 a object,而不是 a class,因此您不需要创建它的实例 - 它基本上是一个单例。因此new不需要。apply这里不涉及。

case class与es有点不同:

case class C(x: Int)
val c = C(10)

这个时间new操作符也没有被使用,但是新对象被创建了——这一次apply()也涉及到了。基本上,当您创建一个时case class,伴随对象也被创建,并apply为您实现了方便的方法(请参阅:使用构造函数,其中函数预期):

val c = C.apply(10)
于 2012-07-09T07:41:39.067 回答
4

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

val a: T = A

val a: A.type = A

工作。

T是你知道A继承的特征的加宽类型,A.type是单例的窄类型object

于 2012-07-09T08:24:48.393 回答