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 ()?
Father
n'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' Mother
interface qui est héritée de ce Child
qui 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' Child
interface 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 quithis
serait 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é).