Como mencionado em outras respostas, a capacidade de adicionar implementação a uma interface foi adicionada para fornecer compatibilidade com versões anteriores na estrutura Coleções. Eu argumentaria que fornecer compatibilidade com versões anteriores é potencialmente a única boa razão para adicionar implementação a uma interface.
Caso contrário, se você adicionar implementação a uma interface, estará violando a lei fundamental do motivo pelo qual as interfaces foram adicionadas em primeiro lugar. Java é uma linguagem de herança única, diferentemente do C ++, que permite herança múltipla. As interfaces fornecem os benefícios de digitação que vêm com um idioma que suporta herança múltipla sem introduzir os problemas que acompanham a herança múltipla.
Mais especificamente, o Java permite apenas herança única de uma implementação, mas permite herança múltipla de interfaces. Por exemplo, o seguinte é um código Java válido:
class MyObject extends String implements Runnable, Comparable { ... }
MyObject
herda apenas uma implementação, mas herda três contratos.
Java transmitiu herança múltipla de implementação porque a herança múltipla de implementação vem com uma série de problemas espinhosos, que estão fora do escopo desta resposta. As interfaces foram adicionadas para permitir a herança múltipla de contratos (aka interfaces) sem os problemas de herança múltipla da implementação.
Para apoiar meu argumento, aqui está uma citação de Ken Arnold e James Gosling do livro The Java Programming Language, 4th edition :
A herança única exclui alguns designs úteis e corretos. Os problemas da herança múltipla surgem da herança múltipla da implementação, mas em muitos casos a herança múltipla é usada para herdar vários contratos abstratos e talvez uma implementação concreta. Fornecer um meio de herdar um contrato abstrato sem herdar uma implementação permite os benefícios de digitação de herança múltipla sem os problemas de herança de implementação múltipla. A herança de um contrato abstrato é denominada
herança de interface . A linguagem de programação Java suporta herança de interface, permitindo que você declare um interface
tipo