polimorfismo - ¿Cómo funciona el nuevo modelo de interfaz predeterminado de Java 8(incluido el diamante, la herencia múltiple y la precedencia)?
metodos default java (2)
Aquí hay una explicación detallada para el nuevo modelo de interfaz Java 8 ''y el problema del diamante de la herencia múltiple .
Como puede ver en estos ejemplos, comenzando con JDK 8 , Java ha introducido un tipo de herencia múltiple ya que ambos, la clase y su interfaz pueden contener una implementación del mismo método (mismo nombre y firma). Para abordar el problema del diamante, existe una prioridad en el orden en que se utiliza una implementación: solo si la clase implementa todos los métodos predeterminados / opcionales de sus interfaces, el código se puede compilar y se usan las implementaciones de esta clase. De lo contrario, el compilador intenta parchar la (s) implementación (es) faltante (s) con la implementación predeterminada de la interfaz . Y si hay múltiples implementaciones predeterminadas de un método, entonces ocurre el problema del diamante y el compilador rechaza la compilación.
El nuevo modelo de interfaces Java 8 ''es el resultado de acercarse a la compatibilidad con versiones anteriores , es decir, mantener compilado el código existente escrito contra las interfaces pre Java 8.
¿Cómo funciona este nuevo modelo de interfaz y de qué se trata?
- el problema del diamante que podría surgir de este
- carácter de herencia múltiple de esta implementación
- y la precedencia con la que se utilizan las implementaciones de interfaz?
Hay una explicación perfecta en las preguntas frecuentes de Java Lambda .
Aquí hay una cita de ¿Qué pasa con el problema del diamante? artículo allí:
interface A {
void m() default { ... }
}
interface B extends A {}
interface C extends A {}
class D implements B, C {}
En el caso inicial (el código anterior), la implementación de m heredada por D es inequívocamente definida por A - no hay otra posibilidad. Si la situación cambia, B ahora también declara una implementación predeterminada de m , que se convierte en la implementación que D hereda con la regla de "implementación más específica". Pero si tanto B como C proporcionan implementaciones predeterminadas, entonces entran en conflicto, y D debe usar la sintaxis X.super.m (...) para elegir explícitamente una de ellas, o redeclarar el método en sí, anulando todas las declaraciones de supertipo.
Asegúrese de revisar el artículo anterior sobre las reglas para resolver declaraciones de métodos en conflicto y otros artículos sobre el proyecto Java Lambda: son bastante buenos.