Jestem nowy w Scali. Zacząłem uczyć się języka dla przyjemności i nadal staram się to obejść. Moje rozumienie cech Scala jest takie, że są one jak interfejsy java, z wyjątkiem tego, że niektóre metody mogą mieć implementację.
Java 8 dodaje interfejsy, które mogą mieć domyślne metody, w których można zapewnić implementację.
Jakie są podobieństwa i różnice między interfejsami Java 8 a cechami Scala?
Odpowiedzi:
Motywacje dla domyślnych metod Java 8 i cech Scala są różne.
Pierwsza została wprowadzona, aby wspierać bezpieczną ewolucję API i ograniczoną formę wielokrotnego dziedziczenia. Korzystając z funkcjonalnych idiomów programowania w Project Lambda, korzystne było dodanie, na przykład,
forEach(lambda)
metody dojava.util.Collection
interfejsu bez zmiany wszystkich możliwych implementatorów (co jest w rzeczywistości niemożliwe bez zerwania wstecznej kompatybilności). Jako efekt uboczny oferowało to również formę mieszanki .Cechy Scala zostały zaprojektowane od podstaw jako bloki konstrukcyjne do tworzenia modułowych komponentów. Są przyjazne dla wielokrotnego dziedziczenia i nie mają problemu z diamentami, ponieważ mają ścisłe zasady dotyczące kolejności oceny miksów z powodu linearyzacji. Obsługują również stan, mogą odwoływać się do klasy implementującej i nakładać ograniczenia na to, który typ może je mieszać. Zajrzyj do biblioteki kolekcji Scala, w której cechy są dokładnie wykorzystywane.
źródło
Zauważ, że z scala 2.12.0 RC1 (wrzesień 2016) ,
Trait
teraz kompiluje do interfejsu.Scala 2.12 polega na optymalnym wykorzystaniu nowych funkcji Java 8
Zobacz scala PR 5003 więcej różnica w realizacji.
źródło
Jeśli chodzi o podobieństwo, obie mogą mieć domyślne metody,
Strona różnic, możemy dodawać cechy tylko do instancji, a nie do całej klasy. Przykład:
trait A { def m = ??? } class B new B() with A
Podobnie jak mądrze, możemy dodawać warstwy cech do instancji.
źródło