Как упоминалось в других ответах, была добавлена возможность добавлять реализацию к интерфейсу для обеспечения обратной совместимости в структуре коллекций. Я бы сказал, что обеспечение обратной совместимости является единственной хорошей причиной для добавления реализации в интерфейс.
Иначе, если вы добавите реализацию к интерфейсу, вы нарушите основной закон, почему интерфейсы были добавлены в первую очередь. Java - это язык с одним наследованием, в отличие от C ++, который допускает множественное наследование. Интерфейсы предоставляют преимущества типизации, которые поставляются с языком, который поддерживает множественное наследование, не создавая проблем, связанных с множественным наследованием.
В частности, Java допускает только одно наследование реализации, но допускает множественное наследование интерфейсов. Например, следующий допустимый код Java:
class MyObject extends String implements Runnable, Comparable { ... }
MyObject
наследует только одну реализацию, но наследует три контракта.
Java передала множественное наследование реализации, потому что множественное наследование реализации сопровождается множеством острых проблем, которые выходят за рамки этого ответа. Интерфейсы были добавлены, чтобы разрешить множественное наследование контрактов (или интерфейсы) без проблем множественного наследования реализации.
Чтобы поддержать мою точку зрения, вот цитата Кена Арнольда и Джеймса Гослинга из книги «Язык программирования Java, 4-е издание» :
Одиночное наследование исключает некоторые полезные и правильные конструкции. Проблемы множественного наследования возникают из-за множественного наследования реализации, но во многих случаях множественное наследование используется для наследования ряда абстрактных контрактов и, возможно, одной конкретной реализации. Предоставление средств для наследования абстрактного контракта без наследования реализации позволяет использовать преимущества множественного наследования без проблем наследования множественной реализации. Наследование абстрактного договора называется
наследованием интерфейса . Язык программирования Java поддерживает наследование интерфейса, позволяя вам объявлять interface
тип