据我所知,Scala中的traits类似于Java中的接口,但允许方法具有实现。此外,与Scala类相比,您无法传递它们用于构造的参数。
到目前为止,这么好。但为什么我被允许实例化它们呢?真的,我认为没有充分理由允许这样做。
答案 0 :(得分:22)
你没有真正实例化它们。当您使用Java进行并行时,让我们进一步了解它。您可以使用Java从抽象类或接口构建Anonymous类。 Scala几乎一样:
scala> trait A
defined trait A
scala> new A {}
res0: A = $anon$1@5736ab79
请注意,从特征创建对象时,花括号为必需。例如,yon不能这样做:
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
当然,如果特征中的某些元素未实现,则需要在创建对象时实现它们:
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