类扩展具有/不具有括号的特征

时间:2013-12-18 16:24:36

标签: scala

Scala in Depth ...

查看此代码
scala> trait Foo {
     |  def someMethod(): Int = 5
     | }
defined trait Foo

scala> class Main() extends Foo {
     |   }
defined class Main

然后,我创建了一个新的Main(没有括号)。

scala> class Main extends Foo {}
defined class Main

class Main()中括号的含义是什么? 没有括号怎么样?

4 个答案:

答案 0 :(得分:4)

5.3规范:

  

如果没有给出正式的参数部分,则为空参数部分   ()假设。

这与方法不同,方法可以是无参数的。

写作时

class A

你真的在写

class A()

此外,

scala> class A(implicit i: Int)
defined class A

scala> new A
<console>:9: error: could not find implicit value for parameter i: Int
              new A
              ^

scala> new A()(1)
res1: A = A@32185a4a

scala> new A(1)
<console>:9: error: too many arguments for constructor A: ()(implicit i: Int)A
              new A(1)
              ^

答案 1 :(得分:3)

它是一样的。如果你不使用括号,它就像空括号一样。

class A()
new A()
new A

class B
new B()
new B

一切都是一样。

答案 2 :(得分:2)

在类名后的括号中,您有主构造函数的参数。在这种情况下,没有参数,因此您可以将括号括起来。

答案 3 :(得分:1)

“什么是惯用”的答案似乎实际上取决于所讨论的功能。根据{{​​3}}的附录A:

  

“在Scala中,如果函数是引用透明的话,给出零参数的方法没有尾部括号通常是惯用的。”

因此,Thing.foo没有副作用(它只是检索一个值),没问题。如果foo有副作用,那么写foo()就是惯用的,以便读者知道其他事情正在发生。无论哪种方式,Scala都假定括号,而不是 make 你写它们。