Was sind die Unterschiede und Ähnlichkeiten zwischen Scala-Merkmalen und Java 8-Schnittstellen?

83

Ich bin neu in Scala und habe angefangen, die Sprache zum Spaß zu lernen. Ich versuche immer noch, mich damit zu beschäftigen. Mein Verständnis von Scala-Merkmalen ist, dass sie wie Java-Schnittstellen sind, außer dass einige Methoden implementiert werden können.

Java 8 fügt Schnittstellen hinzu, die Standardmethoden haben können, mit denen eine Implementierung bereitgestellt werden kann.

Was sind die Ähnlichkeiten und Unterschiede zwischen Java 8-Schnittstellen und Scala-Merkmalen?

ams
quelle
4
Schauen
akki0996
3
tl; dr: Der Hauptmotivator für virtuelle Erweiterungsmethoden [Standardmethoden] ist die API-Evolution. Ein willkommener Nebeneffekt ist, dass sie eine Form der Mehrfachvererbung bieten, die auf das Verhalten beschränkt ist. Merkmale in Scala bieten nicht nur eine mehrfache Vererbung des Verhaltens, sondern auch des Zustands. Neben der Vererbung von Status und Verhalten bieten Merkmale die Möglichkeit, einen Verweis auf die implementierende Klasse zu erhalten ... [Scala] -Eigenschaften bieten eine größere Auswahl an Funktionen als die virtuellen Erweiterungsmethoden von [Java 8].
Brice Roncace

Antworten:

46

Die Motivationen für die Standardmethoden und Scala-Merkmale von Java 8 sind unterschiedlich.

Ersteres wurde eingeführt, um die sichere API-Entwicklung und eine begrenzte Form der Mehrfachvererbung zu unterstützen. Durch die Nutzung funktionaler Programmiersprachen in Project Lambda war es vorteilhaft, beispielsweise eine forEach(lambda)Methode zur java.util.CollectionSchnittstelle hinzuzufügen, ohne alle möglichen Implementierer zu ändern (was tatsächlich unmöglich ist, ohne die Abwärtskompatibilität zu beeinträchtigen). Als Nebeneffekt bot dies auch eine Form der Mixin-Zusammensetzung .

Scala-Merkmale wurden von Grund auf als Bausteine ​​für die Zusammensetzung modularer Komponenten entwickelt. Sie sind mehrfach vererbungsfreundlich und haben kein Diamantproblem, da sie aufgrund der Linearisierung strenge Regeln für die Bewertungsreihenfolge von Mix-Ins haben. Sie unterstützen auch den Status, können auf die implementierende Klasse verweisen und Einschränkungen festlegen, welcher Typ sie einmischen kann. Schauen Sie sich die Scala-Sammlungsbibliothek an, in der Merkmale gründlich verwendet werden.

Tvaroh
quelle
Können Sie näher darauf eingehen? "Scala-Merkmale wurden von Grund auf als Bausteine ​​für die modulare Komponentenzusammensetzung entwickelt." ?
Adelin
14

Beachten Sie, dass mit scala 2.12.0 RC1 (September 2016) , Traitjetzt auf eine Schnittstelle kompiliert.
In Scala 2.12 geht es darum, die neuen Funktionen von Java 8 optimal zu nutzen

Mit Java 8, das konkrete Methoden in Schnittstellen zulässt, kann Scala 2.12 ein Merkmal für eine einzelne Schnittstelle kompilieren.

Zuvor wurde ein Merkmal als eine Klasse dargestellt, die die Methodenimplementierungen und eine Schnittstelle enthielt .
Beachten Sie, dass der Compiler hinter den Kulissen noch einiges an Magie zu bieten hat, sodass Vorsicht geboten ist, wenn ein Merkmal in Java implementiert werden soll.
(Kurz gesagt, wenn ein Merkmal eine der folgenden Aufgaben ausführt, erfordern seine Unterklassen synthetischen Code: Definieren von Feldern, Aufrufen von Super-, Initialisierungsanweisungen im Body, Erweitern einer Klasse, Verlassen auf Linearisierung, um Implementierungen im richtigen Super-Merkmal zu finden.)

Siehe scala PR 5003 mehr den Unterschied der Implementierung.

VonC
quelle
4

Bei Ähnlichkeit können beide Standardmethoden haben.

Seite der Unterschiede: Wir können Merkmale nur der Instanz und nicht der gesamten Klasse hinzufügen. Beispiel:

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

new B() with A 

Ebenso können wir einer Instanz weiterhin Merkmalsebenen hinzufügen.

Ashok Waghmare
quelle