为什么特质实例化?(Why are traits instantiable?)

2019-08-01 11:58发布

据我了解,在斯卡拉性状类似,只是方法是允许有一个实现用Java接口。 此外,相比于Scala类,你不能为其传递参数进行施工。

到现在为止还挺好。 但我为什么允许实例化它们? 说真的,我没有看到一个很好的理由,让这一点。

Answer 1:

你真的不实例化它们。 当你画了与Java并行,让我们进一步走进去。 您可以在Java中建立一个匿名类出一个抽象类或接口。 这几乎是Scala中是相同的:

scala> trait A
defined trait A

scala> new A {}
res0: A = $anon$1@5736ab79

请注意,当您创建一个从特质对象的大括号是强制性的 。 例如,冯不能做:

scala> new A
<console>:9: error: trait A is abstract; cannot be instantiated
              new A
              ^

虽然这将完全适用于A类:

scala> class B
defined class B

scala> new B
res2: B = B@213526b0

当然,如果你的特质一些元素没有实现,你需要在创建对象,以实现它们:

scala> trait C {def foo: Int}
defined trait C

scala> new C {}
<console>:9: error: object creation impossible, since method foo in trait C of type => Int is not defined
              new C {}
                  ^

scala> new C {def foo = 42}
res4: C = $anon$1@744957c7


文章来源: Why are traits instantiable?
标签: scala