Challenge 3: Conflicting Default Methods — Possible Solution ==================================================================== Greeter.java: public interface Greeter { default void greet() { System.out.println("Hello from Greeter"); } } Welcomer.java: public interface Welcomer { default void greet() { System.out.println("Hello from Welcomer"); } } Broken attempt — Host.java: public class Host implements Greeter, Welcomer { // no override of greet() written } Representative compile error: Host.java:1: error: class Host inherits unrelated defaults for greet() from types Greeter and Welcomer public class Host implements Greeter, Welcomer { ^ 1 error Fixed — Host.java: public class Host implements Greeter, Welcomer { @Override public void greet() { Greeter.super.greet(); // explicitly pick Greeter's version } public static void main(String[] args) { new Host().greet(); } } Output: Hello from Greeter Explanation: Both interfaces supply a default greet() with the same signature but different bodies. Java has no rule for which one should silently win, so it refuses to compile Host until greet() is overridden explicitly. The fix calls Greeter.super.greet() to deliberately choose Greeter's version, though the override could just as easily write entirely new logic instead. WHY THIS WORKS AS AN ANSWER ------------------------------ This reproduces the exact narrow diamond-problem-for-behavior case the chapter describes -- two interfaces with conflicting default methods -- and resolves it the way the chapter states Java requires: an explicit override naming which interface's version to use.