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

トレイトからオブジェクトを作成する場合は、中括弧が必須であることに注意してください。たとえば、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
于 2012-10-15T07:55:38.777 に答える