据我所知,Scala 中的特征类似于 Java 中的接口,只是方法允许有实现。此外,与 Scala 类相比,您不能将参数传递给它们以进行构造。
到目前为止,一切都很好。但是为什么我可以实例化它们呢?真的,我认为没有充分的理由允许这样做。
据我所知,Scala 中的特征类似于 Java 中的接口,只是方法允许有实现。此外,与 Scala 类相比,您不能将参数传递给它们以进行构造。
到目前为止,一切都很好。但是为什么我可以实例化它们呢?真的,我认为没有充分的理由允许这样做。
你并没有真正实例化它们。当您与 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