假设我们有以下定义:
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
^
为什么同样的'技巧'在这里不起作用?有什么区别?
答案 0 :(得分:9)
A
是object
,而不是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)
答案 1 :(得分:4)
您的对象A
不是类型,因此您无法在类型归属中使用它。
val a: T = A
和
val a: A.type = A
的工作。
T
是您知道A
继承的特性的扩大类型,A.type
是单身object
的狭窄类型。