为什么在下面的例子中,我不能调用x.callMe()。我的理解是,分配“var x = Test”将返回一个新的Test实例,并在其上调用callMe应该与调用y.callMe()
相同class Test{
def callMe() = println("called")
}
object Test{
def apply() = new Test()
}
var y = new Test()
y.callMe()
var x = Test
x.callMe()
答案 0 :(得分:1)
由于您尝试呼叫的方法不是随播广告的成员,因此请使用:
val x = Test()
x.callMe()
调用您定义的apply
,它将返回您可以调用Test
的{{1}}类的实例。
答案 1 :(得分:1)
如有疑问,请使用Scala控制台。
Welcome to Scala version 2.11.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_25).
Type in expressions to have them evaluated.
Type :help for more information.
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Test{
def callMe() = println("called")
}
object Test{
def apply() = new Test()
}
// Exiting paste mode, now interpreting.
defined class Test
defined object Test
现在让我们看看当你致电new Test()
时会发生什么。
scala> var y = new Test()
y: Test = Test@722c41f4
y
变量的类型为Test
。很明显,我们可以调用callMe()
方法。
scala> y.callMe()
called
执行第二个代码段时:
scala> var x = Test
x: Test.type = Test$@4b6995df
注意类型为Test.type
。这只是对Test
对象的引用。您可以将其称为x()
,它会调用apply()
方法,并且每次都会为您提供新的Test
对象。
scala> x()
res2: Test = Test@3f0ee7cb
scala> x()
res3: Test = Test@60f82f98
您也可以,我相信您首先要做的是,调用Test()
,这将调用apply()
对象上的Test
方法。