Addition: Handling Multiple Inheritance and Diamond Problem in Interfaces
Description
Case 1 — Identical Abstract Methods Example interface A { void show(); } interface B { void show(); }
class Test implements A, B { public void show() { System.out.println("Implemented once"); } }
Key Points
Both interfaces declare the same method signature. The class implements it once. One implementation satisfies both interfaces.
Result No ambiguity Compiles successfully
Reason: Abstract methods contain no implementation — only a contract to fulfill.
Case 2 — Identical Default Methods Example interface A { default void show() { System.out.println("A show"); } }
interface B { default void show() { System.out.println("B show"); } }
class Test implements A, B { }
Result Compile-time error: Duplicate default methods show() from A and B
Reason: Both interfaces provide implementations — Java cannot choose between them. This is the interface form of the Diamond Problem.
Resolution — Override Explicitly class Test implements A, B {
@Override
public void show() {
A.super.show(); // choose A
}
}
Options Use one implementation A.super.show();
Combine both A.super.show(); B.super.show();
Provide custom logic System.out.println("Custom behavior");
Best Practices to Avoid Conflicts Always override conflicting default methods Design interfaces with clear separation of responsibility Avoid overlapping default implementations Document interface composition Use abstract classes when shared behavior hierarchy is needed
Conclusion Java handles multiple interface inheritance safely when: Abstract overlaps are implemented once Default conflicts are resolved explicitly
Following structured interface design prevents ambiguity and improves maintainability.
Source: ashishps1/awesome-low-level-design