¿Cuáles son las diferencias y similitudes entre los rasgos de Scala y las interfaces de Java 8?

84

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?

ams
fuente
4
Echa un
akki0996
3
tl; dr: El motivador principal para los métodos de extensión virtual [métodos predeterminados] es la evolución de API. Un efecto secundario bienvenido es que ofrecen una forma de herencia múltiple, que se limita al comportamiento. Los rasgos en Scala no solo proporcionan una herencia múltiple de comportamiento, sino también de estado. Además de la herencia de estado y comportamiento, los rasgos ofrecen un medio para obtener una referencia a la clase de implementación ... Los rasgos [Scala] ofrecen un conjunto más rico de características que los métodos de extensión virtual de [Java 8].
Brice Roncace

Respuestas:

46

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 para java.util.Collectioninteractuar 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.

Tvaroh
fuente
¿Puede desarrollar más sobre esto? "Los rasgos de Scala se diseñaron desde cero como bloques de construcción para la composición de componentes modulares". ?
Adelin
14

Tenga en cuenta que con scala 2.12.0 RC1 (septiembre de 2016) , Traitahora se compila en una interfaz.
Scala 2.12 se trata de hacer un uso óptimo de las nuevas funciones de Java 8

Con Java 8 que permite métodos concretos en interfaces, Scala 2.12 es capaz de compilar un rasgo en una sola interfaz.

Antes, un rasgo se representaba como una clase que contenía las implementaciones del método y una interfaz .
Tenga en cuenta que el compilador aún tiene un poco de magia que realizar entre bastidores, por lo que se debe tener cuidado si se pretende implementar un rasgo en Java.
(Brevemente, si un rasgo hace alguna de las siguientes, sus subclases requieren código sintético: definir campos, llamar a super, instrucciones inicializadoras en el cuerpo, extender una clase, confiar en la linealización para encontrar implementaciones en el súper rasgo correcto).

Vea scala PR 5003 más la diferencia de implementación.

VonC
fuente
4

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.

Ashok Waghmare
fuente