¿Cuál es la implementación "predeterminada" del método definido en una Interfaz?


En la Interfaz de Colección encontré un método llamado removeIf() que contiene su implementación.

default boolean removeIf(Predicate<? super E> filter) {
    Objects.requireNonNull(filter);  
    boolean removed = false;  
    final Iterator<E> each = iterator();   
    while (each.hasNext()) {  
        if (filter.test(each.next())) {  
            each.remove();  
            removed = true;  
        }  
    }  
    return removed;  
}  

Quiero saber si hay alguna manera de definir el cuerpo del método en una interfaz?
¿Qué es la palabra clave default y cómo funciona?

Author: user2864740, 2013-08-17

3 answers

Java 8 introduce el "Método predeterminado" o (métodos Defender) nueva característica, que permite al desarrollador agregar nuevos métodos a las interfaces sin romper la implementación existente de estas interfaces. Proporciona flexibilidad para permitir la implementación de definición de interfaz que se utilizará como predeterminada en la situación en la que una clase concreta no proporcione una implementación para ese método.

public interface A {
    default void foo(){
       System.out.println("Calling A.foo()");
    }
}

public class ClassAB implements A {
}

Hay una pregunta común que la gente hace acerca de los métodos por defecto cuando se enteran de la nueva característica por primera vez:

¿Qué pasa si la clase implementa dos interfaces y ambas interfaces definen un método predeterminado con la misma firma?

Ejemplo para ilustrar esta situación:

public interface A {  
    default void foo(){  
        System.out.println("Calling A.foo()");  
    }  
}

public interface B {
    default void foo(){
        System.out.println("Calling B.foo()");
    }
}


public class ClassAB implements A, B {

}  

Este código no se compila con el siguiente resultado:

java: class Clazz inherits unrelated defaults for foo() from types A and B

Para arreglar esto, en Clazz, tenemos que resolverlo manualmente sobreescribiendo el método conflictivo:

public class Clazz implements A, B {
    public void foo(){}
}

Pero ¿qué pasa si nos gustaría llamar a la implementación predeterminada del método foo () desde la interfaz A en lugar de implementar la nuestra.

Es posible referirse a un # foo() de la siguiente manera:

public class Clazz implements A, B {
    public void foo(){
       A.super.foo();
    }
}
 154
Author: gifpif,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-03 06:46:18

Esos métodos se llaman métodos predeterminados. El método predeterminadoo el método Defenderes una de las características recién agregadas en Java 8.

Se utilizarán para permitir que un método de interfaz proporcione una implementación utilizada como predeterminada en el caso de que una clase concreta no proporcione una implementación para ese método.

Entonces, si tiene una interfaz, con un método predeterminado:

public interface Hello {
    default void sayHello() {
        System.out.println("Hello");
    }
}

La siguiente clase es perfectamente válida:

public class HelloImpl implements Hello {

}

Si se crea una instancia de HelloImpl:

Hello hello = new HelloImpl();
hello.sayHello();  // This will invoke the default method in interface

Enlaces Útiles:

 49
Author: Rohit Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-17 09:24:03

Hice un poco de investigación y encontré lo siguiente. Espero que esto ayude.

Problema existente

Los métodos de interfaz normales se declaran como abstractos y deben definirse en la clase que implementa la interfaz. Esto 'carga' al implementador de clase con la responsabilidad de implementar cada método declarado. Más importante aún, esto también significa que no es posible extender una interfaz después de "publicación". De lo contrario, todos los implementadores tendrían que adaptar su implementación, rompiendo la fuente hacia atrás y compatibilidad binaria.

Solución adoptada en Java 8

Para hacer frente a estos problemas, una de las nuevas características de JDK 8 es la posibilidad de ampliar las interfaces existentes con métodos predeterminados. Los métodos predeterminados no solo se declaran, sino que también se definen en la interfaz.

Puntos importantes a tener en cuenta

  1. Los implementadores pueden optar por no implementar métodos predeterminados en clase de implementación.
  2. Los implementadores todavía pueden anular el valor predeterminado métodos, como los métodos de clase regulares no finales pueden ser anulados en subclases.
  3. Las clases abstractas pueden incluso (re) declarar métodos predeterminados como abstracta, forzando subclases a reimplementar el método (a veces llamada 're-abstracción').
 17
Author: Aniket Thakur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-17 07:50:27