Jakie są różnice i podobieństwa między cechami Scala a interfejsami Java 8?

84

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?

ams
źródło
4
sprawdź tę stronę, może ci to pomóc infoq.com/articles/java-8-vs-scala
akki0996
3
tl; dr: Głównym motywatorem dla metod wirtualnych rozszerzeń [metody domyślne] jest ewolucja API. Mile widzianym efektem ubocznym jest to, że oferują formę wielokrotnego dziedziczenia, które ogranicza się do zachowania. Cechy w Scali nie tylko zapewniają wielokrotne dziedziczenie zachowania, ale także stanu. Oprócz dziedziczenia stanu i zachowania, cechy oferują sposób na uzyskanie odniesienia do klasy implementującej ... Cechy [Scala] oferują bogatszy zestaw funkcji niż wirtualne metody rozszerzające [Java 8].
Brice Roncace

Odpowiedzi:

46

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 do java.util.Collectioninterfejsu 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.

Tvaroh
źródło
Czy możesz rozwinąć więcej na ten temat: „Cechy Scala zostały zaprojektowane od podstaw jako bloki konstrukcyjne do tworzenia modułowych komponentów”. ?
Adelin
14

Zauważ, że z scala 2.12.0 RC1 (wrzesień 2016) , Traitteraz kompiluje do interfejsu.
Scala 2.12 polega na optymalnym wykorzystaniu nowych funkcji Java 8

Dzięki Java 8 umożliwiającej konkretne metody w interfejsach, Scala 2.12 jest w stanie skompilować cechę do pojedynczego interfejsu.

Wcześniej cecha była reprezentowana jako klasa, która zawierała implementacje metod i interfejs .
Zauważ, że kompilator wciąż ma sporo magii do wykonania za kulisami, więc należy zachować ostrożność, jeśli cecha ma być zaimplementowana w Javie.
(Krótko mówiąc, jeśli cecha wykonuje którąkolwiek z poniższych podklas, jej podklasy wymagają syntetycznego kodu: definiowanie pól, wywoływanie super, instrukcje inicjalizujące w treści, rozszerzanie klasy, poleganie na linearyzacji w celu znalezienia implementacji we właściwej super-cesze.)

Zobacz scala PR 5003 więcej różnica w realizacji.

VonC
źródło
4

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.

Ashok Waghmare
źródło