Jak wspomniano w innych odpowiedziach, dodano możliwość dodania implementacji do interfejsu w celu zapewnienia kompatybilności wstecznej w ramach kolekcji. Twierdziłbym, że zapewnienie kompatybilności wstecznej jest potencjalnie jedynym dobrym powodem dodania implementacji do interfejsu.
W przeciwnym razie, jeśli dodasz implementację do interfejsu, łamiesz podstawowe prawo, dlaczego interfejsy zostały dodane w pierwszej kolejności. Java jest jednym językiem dziedziczenia, w przeciwieństwie do C ++, który pozwala na wielokrotne dziedziczenie. Interfejsy zapewniają korzyści związane z pisaniem w języku obsługującym wielokrotne dziedziczenie bez wprowadzania problemów związanych z wielokrotnym dziedziczeniem.
Mówiąc dokładniej, Java pozwala tylko na pojedyncze dziedziczenie implementacji, ale pozwala na wielokrotne dziedziczenie interfejsów. Na przykład następujący kod Java jest prawidłowy:
class MyObject extends String implements Runnable, Comparable { ... }
MyObject
dziedziczy tylko jedną implementację, ale dziedziczy trzy umowy.
Java przekazała wielokrotne dziedziczenie implementacji, ponieważ wielokrotne dziedziczenie implementacji wiąże się z wieloma drażliwymi problemami, które są poza zakresem tej odpowiedzi. Dodano interfejsy, aby umożliwić wielokrotne dziedziczenie umów (inaczej interfejsy) bez problemów wielokrotnego dziedziczenia implementacji.
Aby wesprzeć moją tezę, oto cytat Kena Arnolda i Jamesa Goslinga z książki The Java Programming Language, wydanie 4 :
Pojedyncze dziedziczenie wyklucza niektóre użyteczne i poprawne projekty. Problemy wielokrotnego dziedziczenia wynikają z wielokrotnego dziedziczenia implementacji, ale w wielu przypadkach wielokrotne dziedziczenie służy do dziedziczenia szeregu abstrakcyjnych umów i być może jednej konkretnej implementacji. Zapewnienie sposobu na dziedziczenie abstrakcyjnej umowy bez dziedziczenia implementacji pozwala na korzyści wynikające z wielokrotnego dziedziczenia bez problemów z wielokrotnym dziedziczeniem implementacji. Dziedziczenie umowy abstrakcyjnej jest nazywane
dziedziczeniem interfejsu . Język programowania Java obsługuje dziedziczenie interfejsu, umożliwiając zadeklarowanie interface
typu