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?
Antworten:
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 zurjava.util.Collection
Schnittstelle 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.
quelle
Beachten Sie, dass mit scala 2.12.0 RC1 (September 2016) ,
Trait
jetzt auf eine Schnittstelle kompiliert.In Scala 2.12 geht es darum, die neuen Funktionen von Java 8 optimal zu nutzen
Siehe scala PR 5003 mehr den Unterschied der Implementierung.
quelle
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.
quelle