una qué poo polimorfismo interfaz interfaces herencia ejemplos código clase asociarías abstracta java scala

qué - public interface java



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

Las motivaciones para los métodos predeterminados de Java 8 y los rasgos de Scala son diferentes.

El primero se introdujo para apoyar 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 método para cada método forEach(lambda) a la interfaz java.util.Collection sin alterar todos los implementadores posibles (lo que es realmente imposible de hacer sin romper la compatibilidad con versiones anteriores). Como efecto secundario, esto también ofrecía una forma de composición de mixina .

Los rasgos de Scala se diseñaron desde cero como bloques de construcción para la composición de componentes modulares. Son amigables con la herencia múltiple y no tienen problemas de diamantes al tener reglas estrictas sobre el orden de evaluación de mezclas debido a la linealización. También admiten estado, pueden hacer referencia a la clase de implementación y colocar restricciones sobre qué tipo puede mezclarse. Mire la biblioteca de colecciones Scala donde los rasgos se usan a fondo.

Soy nuevo en Scala, 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 las interfaces de 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?


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

Con Java 8 permitiendo métodos concretos en las interfaces, Scala 2.12 puede 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 todavía tiene un poco de magia para realizar detrás de las escenas, por lo que debe tenerse cuidado si se pretende implementar un rasgo en Java.
(En resumen, si un rasgo hace algo de lo siguiente, sus subclases requieren código sintético: definir campos, llamar a súper, declaraciones de inicializador en el cuerpo, extender una clase, confiar en la linealización para encontrar implementaciones en el super rasgo correcto).

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