Comme mentionné dans d'autres réponses, la possibilité d'ajouter l'implémentation à une interface a été ajoutée afin de fournir une compatibilité descendante dans le cadre des collections. Je dirais que fournir une compatibilité descendante est potentiellement la seule bonne raison pour ajouter une implémentation à une interface.
Sinon, si vous ajoutez une implémentation à une interface, vous enfreignez la loi fondamentale expliquant pourquoi les interfaces ont été ajoutées en premier lieu. Java est un langage d'héritage unique, contrairement au C ++ qui permet l'héritage multiple. Les interfaces offrent les avantages de frappe qui viennent avec un langage qui prend en charge l'héritage multiple sans introduire les problèmes qui viennent avec l'héritage multiple.
Plus précisément, Java n'autorise que l'héritage unique d'une implémentation, mais il autorise l'héritage multiple d'interfaces. Par exemple, ce qui suit est un code Java valide:
class MyObject extends String implements Runnable, Comparable { ... }
MyObject
hérite d'une seule implémentation, mais hérite de trois contrats.
Java a transmis l'héritage multiple de l'implémentation car l'héritage multiple de l'implémentation s'accompagne d'une multitude de problèmes épineux, qui sortent du cadre de cette réponse. Des interfaces ont été ajoutées pour permettre l'héritage multiple des contrats (aka interfaces) sans les problèmes d'héritage multiple d'implémentation.
Pour appuyer mon propos, voici une citation de Ken Arnold et James Gosling du livre The Java Programming Language, 4e édition :
L'héritage unique empêche certaines conceptions utiles et correctes. Les problèmes d'héritage multiple proviennent de l'héritage multiple d'implémentation, mais dans de nombreux cas l'héritage multiple est utilisé pour hériter d'un certain nombre de contrats abstraits et peut-être d'une implémentation concrète. Fournir un moyen d'hériter d'un contrat abstrait sans hériter d'une implémentation permet les avantages de typage de l'héritage multiple sans les problèmes d'héritage d'implémentation multiple. L'héritage d'un contrat abstrait est appelé
héritage d'interface . Le langage de programmation Java prend en charge l'héritage d'interface en vous permettant de déclarer un interface
type