我对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。但事实并非如此。
答案 0 :(得分:3)
如果它不需要括号,编译器如何能够知道t
是否应该调用apply
方法或者只是绑定到Test
对象?
即
val t = Test
现在这是模棱两可的,因为编译器无法决定是否要将t
绑定到Test
的新实例或Test
配对对象。
此外,如果你想解决歧义,你可以在没有语法糖的情况下调用Test.apply
方法。
此外,你可以问自己,你的Test
课程真的需要成为一个班级吗?或者它也可能是object
?通常当你没有将任何东西传递给构造函数时,它往往是一个符号,你只能使用单例。