Saltar al contenido

Ambigüedad de herencia múltiple con interfaz

Solución:

El problema del diamante solo se aplica a implementación herencia (extends en todas las versiones de Java anteriores a Java 8). No se aplica a API herencia (implements en todas las versiones de Java anteriores a Java 8).

Dado que los métodos de interfaz con firmas de tipo coincidente son compatibles, no hay problema de diamante si hereda la misma firma de método dos veces: las firmas de método coincidente simplemente se fusionan. (Y si las firmas de tipo no son las mismas, tampoco tiene el problema del diamante).

En Java 7 y versiones anteriores, la única forma de heredar implementación el código fue a través del extends palabra clave, que se restringe como máximo a uno de los padres. Por lo tanto, no existe una herencia de implementación múltiple y el problema del diamante no existe.

Java 8 agrega un nuevo aspecto porque permite que las interfaces tengan código de implementación. Todavía escapa al problema del diamante simplemente volviendo al comportamiento anterior (sin herencia de implementación) cuando está implementando múltiples interfaces con métodos que tienen firmas coincidentes.

Para agregar a las respuestas existentes sobre la herencia múltiple de Java8 con interfaces (también conocido como Java todavía evita el problema del diamante):

Hay tres reglas a seguir:

  1. Una clase siempre gana. La implementación del método propio de la clase tiene prioridad sobre los métodos predeterminados en Interfaces.

  2. Si la clase no tiene ninguno: el gana la interfaz más específica

ingrese la descripción de la imagen aquí

  1. Si lo anterior no es el caso, la clase heredada debe declarar explícitamente qué implementación de método está usando (de lo contrario, no se compilará)

ingrese la descripción de la imagen aquí

Java supera este problema a pesar de que las interfaces pueden tener implementaciones predeterminadas de métodos, porque la implementación predeterminada es inequívoco (el de la clase A) o la situación se resuelve con alguna regla (cuando clase B o clase C anula la implementación de la clase A, vea abajo).

Cuando los supertipos de una clase o interfaz proporcionan varios métodos predeterminados con la misma firma:

  • Se prefieren los métodos de instancia sobre los métodos predeterminados de la interfaz.
  • Se ignoran los métodos que ya han sido reemplazados por otros candidatos. Esta circunstancia puede surgir cuando los supertipos comparten un ancestro común..

Sin embargo, si dos o más métodos predeterminados definidos independientemente entran en conflicto, o un método predeterminado entra en conflicto con un método abstracto, el compilador de Java produce un error de compilación. usted debe anular explícitamente los métodos de supertipo. En este caso, podría invocar cualquiera de las implementaciones predeterminadas con la palabra clave super.

Consulte también: ¿Cómo funciona el nuevo modelo de interfaz predeterminado de Java 8 (incluido el diamante, la herencia múltiple y la precedencia)?

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *