为什么申请方法需要parens?

时间:2017-03-17 10:42:43

标签: scala methods

我对scala很陌生,并尝试编写以下简单类:

class Test {
  def m(): Unit = println("Test method")
}

object Test{
  def apply: Test = new Test
}

val t = Test(); //error

但如果我将apply声明如下:

object Test{
    def apply(): Test = new Test
}

然后

val t = Test()

编译好。

为什么呢?如果方法产生一些副作用,我认为我们需要parens。但事实并非如此。

1 个答案:

答案 0 :(得分:3)

如果它不需要括号,编译器如何能够知道t是否应该调用apply方法或者只是绑定到Test对象?

val t = Test

现在这是模棱两可的,因为编译器无法决定是否要将t绑定到Test的新实例或Test配对对象。

此外,如果你想解决歧义,你可以在没有语法糖的情况下调用Test.apply方法。

此外,你可以问自己,你的Test课程真的需要成为一个班级吗?或者它也可能是object?通常当你没有将任何东西传递给构造函数时,它往往是一个符号,你只能使用单例。