public interface Herramienta { default public void ajustar(){ System.out.println("Ajustando herramienta desde interface"); } } public class HerramientaImpl implements Herramienta { public void limpiar(){ System.out.println("Limpiando herramienta"); } } public class TestHerramienta { public static void main(String[] args) { HerramientaImpl herramientaImpl= new HerramientaImpl(); herramientaImpl.ajustar(); } }Un problema de ambiguedad se podría producir cuando una clase implementa dos o mas interfaces que tienen metodos por defecto con el mismo nombre:
public interface HerramientaElectrica{ default public void ajustar(){ System.out.println("Ajustando herramienta desde HerramientaElectrica "); } } public interface HerramientaManual { default public void ajustar(){ System.out.println("Ajustando herramienta desde HerramientaManual "); } } public class HerramientaImpl implements HerramientaElectrica,HerramientaManual { }
La solución al problema se encuentra en definir una implementación al método por defecto:
public class HerramientaImpl implements HerramientaElectrica,HerramientaManual { @Override public void ajustar() { } }Para invocar una implementación del método por defecto lo hacemos sobreescribiendo en nuestra clase
public class HerramientaImpl implements HerramientaElectrica,HerramientaManual { @Override public void ajustar() { HerramientaElectrica.super.ajustar(); } }