2017-02-14 6 views
3

En Java, une classe peut étendre une seule classe parente mais peut implémenter plusieurs interfaces. Avec l'introduction de méthodes par défaut dans l'interface Java 8, il y a la possibilité d'une classe héritant plus d'une méthode avec la même signature en mettant en œuvre 2 interfaces ayant la même méthode par défaut Cela peut créer des problèmes de diamant en C++Règles pour la résolution de probation Diamond ou l'héritage multiple dans Java8

exemple dans le code ci-dessous la sortie de

new C().hello(); is 

This is Second

public interface First { 

    default void hello(){ 
     System.out.println("This is First"); 
    } 
} 

public interface Second extends First { 

    default void hello(){ 
     System.out.println("This is Second"); 
    } 
} 

    public class MyClass implements First,Second { 

    public static void main(String[] args) { 
     new MyClass().hello(); 
    } 
} 

Quelles sont les règles de résolution que Java utilise pour résol problème de diamant? Une réponse simple comme qui a préséance et quand sera grand.

+0

Je me demandais beaucoup. Génial, vous avez soulevé ce problème. –

Répondre

2

Votre fragment n'est pas un problème de diamant car l'interface seconde étend l'interface en premier et remplace la méthode Hello. deuxième le compilateur génère une erreur

Duplicate default methods named hello with the parameters() and() are inherited from the types Second and First 
2

La mise en œuvre de deux interfaces qui déclarent la même méthode par défaut conduit à une erreur de compilation

Sans extension Interface:

MyClass inherits unrelated defaults for sayHi() from types InterfaceA and InterfaceB 

Donc, il n'y a pas de diamant problème;) Pour résoudre ce problème, vous pouvez remplacer la méthode dans la classe d'implémentation et l'implémenter ou la reporter à l'interface appropriée.

Dans votre cas, il ressemblerait à ce que (dans le cas où vous souhaitez utiliser la méthode de l'interface First):

public class MyClass implements First,Second { 
    public void hello() { 
     First.super.hello(); 
    } 
} 
4

Il est le Oracle Tutorial qui explique ce à peu près en détail.

Vous avez essentiellement substitué votre méthode à la première interface et la méthode d'interface la plus spécifique est choisie.

4

Après sont les règles à suivre quand une classe hérite d'une méthode avec la même signature à partir de plusieurs endroits (une autre classe ou interface):

  • classes gagnent toujours. Une déclaration de méthode dans la classe ou une superclasse est prioritaire sur toute déclaration de méthode par défaut.
  • Sinon, les sous-interfaces gagnent: la méthode avec la même signature dans l'interface par défaut la plus spécifique est sélectionnée. (Par exemple, dans votre cas, la méthode de la deuxième interface devrait fonctionner comme Second extends First).
  • Enfin, si le choix est toujours ambigu, la classe héritant de plusieurs interfaces doit sélectionner explicitement l'implémentation de la méthode par défaut à utiliser en la remplaçant et en appelant explicitement la méthode souhaitée .
+0

C'est exactement ce que je cherchais. Une réponse très précise avec tous les scénarios couverts. Merci! Rohit –