Pourquoi la compilation Java 8 échoue lorsque la méthode par défaut est remplacée par de la sous-classe Méthode statique?

Cristiano étapes:

Compte tenu de Java 8, pourquoi le code ci-dessous ne peut pas compiler?

interface Father {
    static void method() { }
}

interface Mother {
    default void method() { }
}

interface Child extends Father, Mother {
    static void method() { }
}

Selon ma compréhension, chaque méthode statique appartient à sa classe spécifique, d' où, pourquoi , lorsque l' interface enfant définit static void method() { }le compilateur donne l'erreur suivante?

Procédé () dans des accrochages avec l'enfant procédé () dans la redéfinition de méthode mère est statique

Enfant ne devrait pas garder la mise en œuvre de la méthode par défaut de mère tout en permettant le père et l'enfant avec ses propres méthodes statiques telles que: Father.method () et Child.method ()?

Pshemo:

Fathern'est pas un problème car les méthodes statiques à partir d' interfaces sont pas héritées (par exemple List.of(..)ne peut pas être invoqué par l' intermédiaire ArrayList.of(..)) donc il n'y a pas de remplaçant / cacher ce qui signifie aussi aucune collision.

À cause de cela, nous pouvons écrire en toute sécurité

interface Father {
    static void method() { } 
}
interface Child extends Father {
    static void method() { } 
}

Problème est default void method() { }procédé à partir de l' Motherinterface qui est héritée de ce Childqui signifie qu'après

interface Child extends Father, Mother { 
    static void method() { } 
}

vous finiriez avec une interface qui aurait deux method()versions: statique et non statique (par défaut)

interface Child extends Father, Mother { 
    static void method() { } 
    default void method() { } //inherited from Mother
}

Mais pourquoi est-ce un problème?

Imaginez que vous voulez ajouter une autre méthode pour l' Childinterface qui va appelermethod()

interface Child extends Father, Mother { 
    static void method() { } 
    default void method() { } //inherited from Mother
    default void demo(){
        method(); //which code block should be executed?
    }
}

Faut - il exécuter du code de statique méthode () ou par défaut méthode ()? Compilateur ne serait pas en mesure de décider.

Bien que cette situation pourrait être résolu en utilisant

  • Child.method() pour la méthode statique,
  • this.method()pour la méthode par défaut (oui, ce wound't ambiguë parce que la méthode statique ne serait pas héritée par la classe qui thisserait par exemple),

le point est d'éviter de tels problèmes en premier lieu. Voilà pourquoi nous sommes tenus de ne pas avoir des méthodes statiques et non statiques avec la même signature (nom + parameterTypes) en un seul endroit (défini ou hérité).

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=225634&siteId=1
conseillé
Classement