Quali sono le differenze e le somiglianze tra i tratti di Scala e le interfacce Java 8?


84

Sono nuovo di Scala e ho iniziato ad imparare la lingua per divertimento e sto ancora cercando di capirci qualcosa. La mia comprensione dei tratti di Scala è che sono come le interfacce Java, tranne per il fatto che alcuni metodi possono avere un'implementazione.

Java 8 aggiunge interfacce che possono avere metodi predefiniti in cui è possibile fornire un'implementazione.

Quali sono le somiglianze e le differenze tra le interfacce Java 8 e i tratti di Scala?


4
controlla quel sito web, potrebbe aiutarti infoq.com/articles/java-8-vs-scala
akki0996

3
tl; dr: La motivazione principale per i metodi di estensione virtuale [metodi predefiniti] è l'evoluzione delle API. Un gradito effetto collaterale è che offrono una forma di eredità multipla, che è limitata al comportamento. I tratti in Scala non solo forniscono eredità multipla di comportamento, ma anche di stato. Oltre all'ereditarietà dello stato e del comportamento, i tratti offrono un mezzo per ottenere un riferimento alla classe di implementazione ... I tratti [Scala] offrono un insieme più ricco di funzionalità rispetto ai metodi di estensione virtuale di [Java 8].
Brice Roncace

Risposte:


46

Le motivazioni per i metodi predefiniti di Java 8 e i tratti di Scala differiscono.

Il primo è stato introdotto per supportare l'evoluzione sicura delle API e una forma limitata di ereditarietà multipla. Sfruttando gli idiomi di programmazione funzionale in Project Lambda è stato utile aggiungere, ad esempio, un forEach(lambda)metodo per java.util.Collectioninterfacciarsi senza alterare tutti i possibili implementatori (cosa impossibile da fare senza interrompere la compatibilità con le versioni precedenti). Come effetto collaterale, questo ha offerto anche una forma di composizione di mixin .

I tratti di Scala sono stati progettati da zero come elementi costitutivi per la composizione di componenti modulari. Sono compatibili con l'ereditarietà multipla e non hanno problemi con i diamanti avendo regole rigide sull'ordine di valutazione dei mix-in dovuti alla linearizzazione. Supportano anche lo stato, possono fare riferimento alla classe di implementazione e imporre restrizioni su quale tipo può combinarli. Guarda la libreria delle collezioni Scala dove i tratti sono usati a fondo.


Puoi approfondire questo argomento "I tratti di Scala sono stati progettati da zero come elementi costitutivi per la composizione di componenti modulari". ?
Adelin

14

Notare che con scala 2.12.0 RC1 (settembre 2016) , Traitora compila un'interfaccia.
Scala 2.12 punta a fare un uso ottimale delle nuove funzionalità di Java 8

Con Java 8 che consente metodi concreti nelle interfacce, Scala 2.12 è in grado di compilare un tratto in una singola interfaccia.

Prima, un tratto era rappresentato come una classe che conteneva le implementazioni del metodo e un'interfaccia .
Nota che il compilatore ha ancora un bel po 'di magia da eseguire dietro le quinte, quindi è necessario prestare attenzione se un tratto deve essere implementato in Java.
(In breve, se un tratto esegue una delle seguenti sottoclassi richiede codice sintetico: definizione di campi, chiamata super, istruzioni di inizializzazione nel corpo, estensione di una classe, affidamento sulla linearizzazione per trovare implementazioni nel super tratto corretto.)

Vedi scala PR 5003 più la differenza di implementazione.


4

Sulla somiglianza, entrambi possono avere metodi predefiniti,

Lato differenze, possiamo aggiungere tratti solo all'istanza e non all'intera classe. Esempio:

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

new B() with A 

Come saggio possiamo continuare ad aggiungere strati di tratti su un'istanza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.