据我所知,Scala中的traits类似于Java中的接口,但允许方法具有实现.此外,与Scala类相比,您无法传递它们的构造参数.
到现在为止还挺好.但为什么我被允许实例化它们呢?真的,我认为没有充分理由允许这样做.
Nic*_*las 22
你没有真正实例化它们.当您使用Java进行并行时,让我们进一步了解它.您可以在Java中使用抽象类或接口构建Anonymous类.Scala几乎相同:
scala> trait A
defined trait A
scala> new A {}
res0: A = $anon$1@5736ab79
Run Code Online (Sandbox Code Playgroud)
请注意,从特征创建对象时,花括号是必需的.例如,yon不能这样做:
scala> new A
<console>:9: error: trait A is abstract; cannot be instantiated
new A
^
Run Code Online (Sandbox Code Playgroud)
虽然它适用于一个类:
scala> class B
defined class B
scala> new B
res2: B = B@213526b0
Run Code Online (Sandbox Code Playgroud)
当然,如果特征中的某些元素未实现,则需要在创建对象时实现它们:
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
Run Code Online (Sandbox Code Playgroud)