Como se mencionó en otras respuestas, se agregó la capacidad de agregar implementación a una interfaz para proporcionar compatibilidad con versiones anteriores en el marco de Colecciones. Yo diría que proporcionar compatibilidad con versiones anteriores es potencialmente la única buena razón para agregar implementación a una interfaz.
De lo contrario, si agrega implementación a una interfaz, está violando la ley fundamental de por qué las interfaces se agregaron en primer lugar. Java es un lenguaje de herencia único, a diferencia de C ++ que permite la herencia múltiple. Las interfaces proporcionan los beneficios de escritura que vienen con un lenguaje que admite la herencia múltiple sin presentar los problemas que vienen con la herencia múltiple.
Más específicamente, Java solo permite la herencia única de una implementación, pero sí permite la herencia múltiple de interfaces. Por ejemplo, el siguiente es un código Java válido:
class MyObject extends String implements Runnable, Comparable { ... }
MyObject
hereda solo una implementación, pero hereda tres contratos.
Java transmitió la herencia múltiple de la implementación porque la herencia múltiple de la implementación viene con una serie de problemas espinosos, que están fuera del alcance de esta respuesta. Se agregaron interfaces para permitir la herencia múltiple de contratos (también conocidas como interfaces) sin los problemas de herencia múltiple de la implementación.
Para apoyar mi punto, aquí hay una cita de Ken Arnold y James Gosling del libro The Java Programming Language, cuarta edición :
La herencia única excluye algunos diseños útiles y correctos. Los problemas de la herencia múltiple surgen de la herencia múltiple de la implementación, pero en muchos casos se usa la herencia múltiple para heredar varios contratos abstractos y quizás una implementación concreta. Proporcionar un medio para heredar un contrato abstracto sin heredar una implementación permite los beneficios de tipificación de la herencia múltiple sin los problemas de la herencia de implementación múltiple. La herencia de un contrato abstracto se denomina
herencia de interfaz . El lenguaje de programación Java admite la herencia de interfaces al permitirle declarar un interface
tipo