私が学んだ限りでは、Scalaの特性は、メソッドに実装が許可されていることを除けば、Javaのインターフェースに似ています。また、Scalaクラスとは対照的に、構築のために引数を渡すことはできません。
ここまでは順調ですね。しかし、なぜそれらをインスタンス化することが許可されているのですか?本当に、これを許可する正当な理由はわかりません。
私が学んだ限りでは、Scalaの特性は、メソッドに実装が許可されていることを除けば、Javaのインターフェースに似ています。また、Scalaクラスとは対照的に、構築のために引数を渡すことはできません。
ここまでは順調ですね。しかし、なぜそれらをインスタンス化することが許可されているのですか?本当に、これを許可する正当な理由はわかりません。
それらを実際にインスタンス化することはありません。Javaとの類似点を描いたので、さらに詳しく見ていきましょう。Javaでは、抽象クラスまたはインターフェイスから匿名クラスを構築できます。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