Jaka jest" domyślna " implementacja metody zdefiniowana w interfejsie?

W interfejsie Collection znalazłem metodę o nazwie removeIf(), która zawiera jej implementację.

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;  
}  

Chcę wiedzieć, czy jest jakiś sposób na zdefiniowanie ciała metody w interfejsie?
Co to jest słowo kluczowe default i jak to działa?

Author: user2864740, 2013-08-17

3 answers

Java 8 wprowadza nową funkcję "Default Method" lub (Defender methods), która pozwala programistom dodawać nowe metody do interfejsów bez przerywania istniejącej implementacji tych interfejsów. Zapewnia elastyczność pozwalającą zdefiniować implementację interfejsu, która będzie używana jako domyślna w sytuacji, gdy konkretna klasa nie dostarczy implementacji dla tej metody.

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

public class ClassAB implements A {
}

Jest jedno powszechne pytanie, które ludzie zadają o domyślnych metod, gdy słyszą o nowa funkcja po raz pierwszy:

Co jeśli klasa implementuje dwa interfejsy i oba te interfejsy definiują domyślną metodę z tym samym podpisem?

Przykład do zilustrowania tej sytuacji:

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 {

}  

Ten kod nie kompiluje się z następującym wynikiem:

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

Aby to naprawić, w Clazz, musimy rozwiązać go ręcznie przez nadpisanie sprzecznej metody:

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

Ale co jeśli chcielibyśmy wywołać domyślną implementację metody foo () z interfejsu A zamiast implementacji własnego.

Możliwe jest odwołanie się do # foo () w następujący sposób:

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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-03 06:46:18

Metody te nazywane są metodami domyślnymi. Default methodor Defender methodis one of newly added features in Java 8.

Będą one używane w celu umożliwienia metodzie interfejsu dostarczenia implementacji używanej jako domyślna w przypadku, gdy konkretna klasa nie dostarczy implementacji dla tej metody.

Więc, jeśli masz interfejs, z domyślną metodą:

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

Następująca klasa jest doskonale poprawna:

public class HelloImpl implements Hello {

}

Jeśli tworzysz instancję HelloImpl:

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

Przydatne Linki:

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-17 09:24:03

Zrobiłem trochę badań i znalazłem następujące. Mam nadzieję, że to pomoże.

Istniejący problem

Zwykłe metody interfejsu są deklarowane jako abstrakcyjne i muszą być zdefiniowane w klasie implementującej interfejs. To "obciąża" implementatora klasy odpowiedzialnością za implementację każdej zadeklarowanej metody. Co ważniejsze, oznacza to również, że rozszerzenie interfejsu nie jest możliwe po "publikacji". W przeciwnym razie wszyscy realizatorzy musieliby dostosować swoje implementacja, łamanie wstecznego źródła i kompatybilność binarna.

Rozwiązanie przyjęte w Javie 8

Aby poradzić sobie z tymi problemami, jedną z nowych funkcji JDK 8 jest możliwość rozszerzenia istniejących interfejsów o domyślne metody. domyślne metody są nie tylko deklarowane, ale również definiowane w interfejsie.

Ważne punkty do odnotowania

  1. Implementatorzy mogą nie implementować domyślnych metod w Klasa wdrożeniowa.
  2. Implementatorzy nadal mogą zastąpić domyślne metody, podobnie jak zwykłe niekończące się metody klasy mogą być nadpisywane w podklasy.
  3. klasy abstrakcyjne mogą nawet (re)deklarować domyślne metody jako abstrakcyjne, zmuszając podklasy do reimplementacji metody (czasami nazywany "re-abstrakcją").
 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/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-17 07:50:27