6

据我所知,Scala 中的特征类似于 Java 中的接口,只是方法允许有实现。此外,与 Scala 类相比,您不能将参数传递给它们以进行构造。

到目前为止,一切都很好。但是为什么我可以实例化它们呢?真的,我认为没有充分的理由允许这样做。

4

1 回答 1

22

你并没有真正实例化它们。当您与 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
              ^

虽然它适用于一个类:

scala> class B
defined class B

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

当然,如果你的 trait 中的某些元素没有实现,你需要在创建对象时实现它们:

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
于 2012-10-15T07:55:38.777 回答