无法通过伴侣对象调用函数

时间:2014-12-31 09:34:42

标签: java scala

为什么在下面的例子中,我不能调用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()

2 个答案:

答案 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方法。