103 votes

Quelle est l'implémentation "par défaut" de la méthode définie dans une interface?

Dans l'interface de collection, j'ai trouvé une méthode nommée removeIf() qui contient son implémentation.

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

Je veux savoir s'il existe un moyen de définir un corps de méthode dans une interface?
Qu'est-ce que le mot clé default et comment fonctionne-t-il?

181voto

Pawan mishra Points 878

Il ya une question commune que les gens se posent sur les méthodes par défaut lorsqu'ils entendent parler de la nouvelle fonction pour la première fois: What if the class implements two interfaces and both those interfaces define a default method with the same signature?. Nous allons utiliser l'exemple précédent pour illustrer cette situation

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 Clazz implements A, B {
}  

Ce code ne peut pas compiler avec le résultat suivant:

java: class Clazz hérite sans rapport avec les valeurs par défaut pour les foo() des types A et B

Pour remédier à cela, dans Clazz, nous avons à résoudre manuellement par des raisons impérieuses le conflit méthode:

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

Mais si l'on souhaite appeler l'implémentation par défaut de la méthode foo() à partir de l'interface d'Un lieu de mise en œuvre de notre propre. Il est possible de se référer à consulter Un#foo() comme suit:

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

51voto

Rohit Jain Points 90368

Ces méthodes sont appelées méthodes par défaut. Méthode par défaut ou le Défenseur de la méthode est l'une des nouvelles fonctionnalités de Java 8.

Ils seront utilisés pour permettre à une méthode d'interface pour fournir une implémentation par défaut dans le cas d'un béton de classe n'est pas de fournir une implémentation de cette méthode.

Donc, si vous disposez d'une interface, avec une méthode par défaut:

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

La classe suivante est parfaitement valide:

public class HelloImpl implements Hello {

}

Si vous créez une instance de HelloImpl:

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

Liens Utiles:

20voto

Aniket Thakur Points 10135

J'ai fait un peu de recherche et j'ai trouvé le suivant. Espérons que cette aide.

Problème existant

L'interface normale méthodes sont déclarées comme abstraite et doit être défini dans la classe qui implémente l'interface. Ce "fardeau" de la classe du maître d'œuvre avec la responsabilité de mettre en œuvre toute méthode déclarée. Plus important encore, cela signifie également que le fait d'étendre une interface n'est pas possible après la "diffusion". Sinon, tous les exécutants doivent adapter leur mise en œuvre, la rupture de l'arrière de la source et de la compatibilité binaire.

La Solution adoptée dans Java 8

Pour faire face à ces problèmes, l'une des nouvelles fonctionnalités de JDK 8 est la possibilité d'étendre les interfaces existantes avec les méthodes par défaut. Méthodes par défaut ne sont pas seulement déclaré, mais également définies dans l'interface.

Points importants à noter

  1. Les exécutants peuvent choisir de ne pas mettre en œuvre des méthodes par défaut dans la mise en œuvre de la classe.
  2. Les exécutants peuvent modifier par défaut méthodes, comme la non-final les méthodes de la classe peuvent être remplacés dans les sous-classes.
  3. Les classes abstraites peuvent même (re)déclarer des méthodes par défaut abstrait, forçant les sous-classes de réimplémenter la méthode (parfois appelé "re-abstraction').

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X