88 votes

Quelles sont les différences et les similitudes entre les traits de Scala et les interfaces de Java 8 ?

Je suis novice en Scala, j'ai commencé à apprendre le langage pour le plaisir et j'essaie toujours de m'y retrouver. D'après ce que je comprends, les traits Scala sont comme les interfaces Java, sauf que certaines méthodes peuvent avoir une implémentation.

Java 8 ajoute des interfaces qui peuvent avoir des méthodes par défaut où une implémentation peut être fournie.

Quelles sont les similitudes et les différences entre les interfaces de Java 8 et les traits de Scala ?

49voto

Tvaroh Points 666

Motivations pour Méthodes par défaut de "Java 8 y Traits en Scala différents.

Le premier a été introduit pour prendre en charge l'évolution sûre des API et une forme limitée d'héritage multiple. En utilisant les idiomes de la programmation fonctionnelle dans Project Lambda, il a été bénéfique d'ajouter, par exemple, une fonction forEach(lambda) pour java.util.Collection sans modifier tous les implémenteurs possibles (ce qui est en fait impossible à faire sans rompre la compatibilité ascendante). Comme effet secondaire, cela a également offert une forme de composition des mixines .

Traits en Scala ont été conçus à partir de zéro comme des blocs de construction pour la composition de composants modulaires. Ils sont compatibles avec l'héritage multiple et n'ont pas d'exigences en matière d'héritage. problème des diamants en ayant des règles strictes sur l'ordre d'évaluation des mélanges en raison de la linéarisation. Ils supportent également l'état, peuvent faire référence à la classe d'implémentation et imposent des restrictions sur les types qui peuvent les mélanger. Regardez la bibliothèque de collections de Scala où les traits sont utilisés à fond.

15voto

VonC Points 414372

Notez qu'avec scala 2.12.0 RC1 (sept. 2016) , Trait compile maintenant vers une interface.
Scala 2.12 a pour but d'utiliser de manière optimale les nouvelles fonctionnalités de Java 8.

Java 8 autorisant les méthodes concrètes dans les interfaces, Scala 2.12 est capable de compiler un trait en une seule interface.

Auparavant, un trait était représenté par une classe contenant les implémentations des méthodes et une interface. .
Notez que le compilateur a encore pas mal de magie à opérer en coulisse, de sorte qu'il faut faire attention si un trait est destiné à être implémenté en Java.
(En bref, si un trait fait l'une des choses suivantes, ses sous-classes nécessitent du code synthétique : définition des champs, appel de super, déclarations d'initialisation dans le corps, extension d'une classe, recours à la linéarisation pour trouver des implémentations dans le bon super trait).

Voir scala PR 5003 plus la différence de mise en œuvre.

7voto

Ashok Waghmare Points 108

Par similitude, les deux peuvent avoir des méthodes par défaut,

Côté différences, nous pouvons ajouter des traits à l'instance seulement, et non à la classe entière. Exemple :

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

new B() with A 

De même, nous pouvons continuer à ajouter des couches de traits sur une instance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X