私はScalaに不慣れで、楽しみのために言語を学び始めましたが、それでも頭を悩ませようとしています。Scalaの特性についての私の理解は、いくつかのメソッドが実装を持つことができることを除いて、それらはJavaインターフェースに似ているということです。
Java 8は、実装を提供できるデフォルトのメソッドを持つことができるインターフェースを追加しています。
Java 8インターフェースとScalaトレイトの類似点と相違点は何ですか?
私はScalaに不慣れで、楽しみのために言語を学び始めましたが、それでも頭を悩ませようとしています。Scalaの特性についての私の理解は、いくつかのメソッドが実装を持つことができることを除いて、それらはJavaインターフェースに似ているということです。
Java 8は、実装を提供できるデフォルトのメソッドを持つことができるインターフェースを追加しています。
Java 8インターフェースとScalaトレイトの類似点と相違点は何ですか?
回答:
Java8のデフォルトメソッドとScalaトレイトの動機は異なります。
前者は、安全なAPIの進化と限定された形式の多重継承をサポートするために導入されました。Project Lambdaで関数型プログラミングのイディオムを活用することで、たとえば、考えられるすべての実装者を変更せずforEach(lambda)
にjava.util.Collection
インターフェイスするメソッドを追加することは有益です(これは下位互換性を壊さずに行うことは実際には不可能です)。副作用として、これはまた、ミックスイン組成物の形態を提供しました。
Scalaの特性は、モジュラーコンポーネント構成の構成要素としてゼロから設計されました。多重継承に対応しており、線形化によるミックスインの評価順序に厳密なルールがあるため、ダイヤモンドの問題はありません。また、状態をサポートし、実装クラスを参照し、それらを混在させることができるタイプに制限を設けることができます。特性が徹底的に使用されているScalaコレクションライブラリを見てください。
scala 2.12.0 RC1(2016年9月)ではTrait
、インターフェースにコンパイルされることに注意してください。
Scala 2.12は、Java8の新機能を最大限に活用することを目的としています。
Java 8ではインターフェースで具体的なメソッドを使用できるため、Scala2.12はトレイトを単一のインターフェースにコンパイルできます。
以前は、トレイトはメソッドの実装とインターフェイスを保持するクラスとして表されていました。
コンパイラにはまだ舞台裏で実行するためのかなりの魔法があることに注意してください。そのため、トレイトをJavaで実装する場合は、注意が必要です。
(簡単に言うと、トレイトが次のサブクラスのいずれかを実行する場合、合成コードが必要です:フィールドの定義、本体でのスーパー初期化ステートメントの呼び出し、クラスの拡張、線形化に依存して適切なスーパートレイトの実装を見つけます。)
実装の違いについては、scala PR5003を参照してください。