ScalaトレイトとJava8インターフェースの違いと類似点は何ですか?


84

私はScalaに不慣れで、楽しみのために言語を学び始めましたが、それでも頭を悩ませようとしています。Scalaの特性についての私の理解は、いくつかのメソッドが実装を持つことができることを除いて、それらはJavaインターフェースに似ているということです。

Java 8は、実装を提供できるデフォルトのメソッドを持つことができるインターフェースを追加しています。

Java 8インターフェースとScalaトレイトの類似点と相違点は何ですか?


4
そのウェブサイトをチェックしてください、それはあなたを助けるかもしれませんinfoq.com/articles/java-8-vs-scala
akki0996

3
tl; dr:仮想拡張メソッド[デフォルトメソッド]の主な動機はAPIの進化です。歓迎すべき副作用は、動作に限定された多重継承の形式を提供することです。Scalaの特性は、動作の多重継承を提供するだけでなく、状態の継承も提供します。状態と動作の継承に加えて、トレイトは実装クラスへの参照を取得する手段を提供します... [Scala]トレイトは、[Java8の]仮想拡張メソッドよりも豊富な機能セットを提供します。
Brice Roncace 2014

回答:


46

Java8のデフォルトメソッドScalaトレイトの動機は異なります。

前者は、安全なAPIの進化と限定された形式の多重継承をサポートするために導入されました。Project Lambdaで関数型プログラミングのイディオムを活用することで、たとえば、考えられるすべての実装者を変更せずforEach(lambda)java.util.Collectionインターフェイスするメソッドを追加することは有益です(これは下位互換性を壊さずに行うことは実際には不可能です)。副作用として、これはまた、ミックスイン組成物の形態を提供しました。

Scalaの特性は、モジュラーコンポーネント構成の構成要素としてゼロから設計されました。多重継承に対応しており、線形化によるミックスインの評価順序に厳密なルールがあるため、ダイヤモンドの問題はありません。また、状態をサポートし、実装クラスを参照し、それらを混在させることができるタイプに制限を設けることができます。特性が徹底的に使用されているScalaコレクションライブラリを見てください。


この「Scalaの特性は、モジュラーコンポーネント構成のビルディングブロックとしてゼロから設計された」について詳しく説明していただけますか。?
アデリン

14

scala 2.12.0 RC1(2016年9月)ではTrait、インターフェースにコンパイルされることに注意してください。
Scala 2.12は、Java8の新機能を最大限に活用することを目的としています。

Java 8ではインターフェースで具体的なメソッドを使用できるため、Scala2.12はトレイトを単一のインターフェースにコンパイルできます。

以前は、トレイトはメソッドの実装とインターフェイスを保持するクラスとして表されていました
コンパイラにはまだ舞台裏で実行するためのかなりの魔法があることに注意してください。そのため、トレイトをJavaで実装する場合は、注意が必要です。
(簡単に言うと、トレイトが次のサブクラスのいずれかを実行する場合、合成コードが必要です:フィールドの定義、本体でのスーパー初期化ステートメントの呼び出し、クラスの拡張、線形化に依存して適切なスーパートレイトの実装を見つけます。)

実装の違いについては、scala PR5003を参照してください。


4

類似性については、両方にデフォルトのメソッドを設定できます。

違いは、クラス全体ではなく、インスタンスのみに特性を追加できることです。例:

trait A { def m = ??? }
class B 

new B() with A 

同様に、インスタンスにトレイトレイヤーを追加し続けることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.