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

Je suis nouveau à Scala a commencé à apprendre la langue pour le plaisir et j’essaie toujours de comprendre. Ma compréhension des traits de Scala est qu’ils 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 Java 8 et les caractéristiques Scala?

Les motivations pour les méthodes par défaut de Java 8 et les caractéristiques Scala sont différentes.

Le premier a été introduit pour prendre en charge l’évolution sûre des API et une forme limitée d’inheritance multiple. En exploitant les idiomes de functional programming dans Project Lambda, il a été bénéfique d’append, par exemple, une forEach(lambda) à l’interface java.util.Collection sans modifier tous les implémenteurs possibles (ce qui est en fait impossible sans une compatibilité descendante). Comme effet secondaire, cela offrait également une forme de composition de mixin .

Les traits de Scala ont été conçus à partir de zéro comme éléments constitutifs de la composition des composants modulaires. Ils sont compatibles avec les inheritances multiples et n’ont pas de problème de diamant en raison de règles ssortingctes sur l’ordre d’évaluation des mélanges en raison de la linéarisation. Ils prennent également en charge l’état, peuvent référencer la classe d’implémentation et placer des ressortingctions sur le type qui peut les intégrer. Regardez la bibliothèque de collections Scala où les traits sont utilisés à fond.

Notez qu’avec scala 2.12.0 RC1 (sept. 2016) , Trait maintenant compilé en une interface.
Scala 2.12 consiste à utiliser au mieux les nouvelles fonctionnalités de Java 8

Avec Java 8 permettant des méthodes concrètes dans les interfaces, Scala 2.12 est capable de comstackr un trait à une seule interface.

Avant, un trait était représenté comme une classe contenant les implémentations de méthode et une interface .
Notez que le compilateur a encore un peu de magie à faire en arrière-plan, de sorte qu’il faut faire attention si un trait doit être implémenté en Java.
(En bref, si un trait a l’une des sous-classes suivantes, son code synthétique est nécessaire: définir des champs, appeler super, instructions d’initialisation dans le corps, étendre une classe, s’appuyer sur la linéarisation pour trouver les implémentations appropriées).

Voir scala PR 5003 plus la différence d’implémentation.