Soy nuevo en Scala y comencé a aprender el idioma por diversión y todavía estoy tratando de entenderlo. Mi comprensión de los rasgos de Scala es que son como interfaces java excepto que algunos métodos pueden tener una implementación.
Java 8 está agregando interfaces que pueden tener métodos predeterminados donde se puede proporcionar una implementación.
¿Cuáles son las similitudes y diferencias entre las interfaces de Java 8 y los rasgos de Scala?
Respuestas:
Las motivaciones para los métodos predeterminados de Java 8 y los rasgos de Scala difieren.
El primero se introdujo para admitir la evolución segura de API y una forma limitada de herencia múltiple. Al aprovechar los modismos de programación funcional en Project Lambda, ha sido beneficioso agregar, por ejemplo, un
forEach(lambda)
método parajava.util.Collection
interactuar sin alterar todos los implementadores posibles (lo que en realidad es imposible de hacer sin romper la compatibilidad con versiones anteriores). Como efecto secundario, esto también ofreció una forma de composición mixina .Los rasgos de Scala se diseñaron desde cero como bloques de construcción para la composición de componentes modulares. Son compatibles con la herencia múltiple y no tienen problemas de diamantes al tener reglas estrictas sobre el orden de evaluación de las mezclas debido a la linealización. También son compatibles con el estado, pueden hacer referencia a la clase de implementación y establecer restricciones sobre qué tipo puede mezclarlos. Mire la biblioteca de colecciones de Scala donde los rasgos se utilizan a fondo.
fuente
Tenga en cuenta que con scala 2.12.0 RC1 (septiembre de 2016) ,
Trait
ahora se compila en una interfaz.Scala 2.12 se trata de hacer un uso óptimo de las nuevas funciones de Java 8
Vea scala PR 5003 más la diferencia de implementación.
fuente
Por similitud, ambos pueden tener métodos predeterminados,
Por el lado de las diferencias, podemos agregar rasgos solo a una instancia, y no a toda la clase también. Ejemplo:
trait A { def m = ??? } class B new B() with A
Asimismo, podemos seguir agregando capas de rasgos en una instancia.
fuente