Java 8 présente des méthodes par défaut pour offrir la possibilité d'étendre les interfaces sans avoir à modifier les implémentations existantes.
Je me demande s'il est possible d'invoquer explicitement l'implémentation par défaut d'une méthode lorsque cette méthode a été remplacée ou n'est pas disponible en raison d'implémentations par défaut conflictuelles dans différentes interfaces.
interface A {
default void foo() {
System.out.println("A.foo");
}
}
class B implements A {
@Override
public void foo() {
System.out.println("B.foo");
}
public void afoo() {
// how to invoke A.foo() here?
}
}
Compte tenu du code ci-dessus, comment appelleriez-vous à A.foo()
partir d'une méthode de classe B?
Réponses:
Selon cet article, vous accédez à la méthode par défaut dans l'interface en
A
utilisantCela pourrait être utilisé comme suit (en supposant que les interfaces
A
et lesC
deux ont des méthodes par défautfoo()
)A
etC
peuvent tous deux avoir des.foo()
méthodes et l'implémentation par défaut spécifique peut être choisie ou vous pouvez en utiliser une (ou les deux) dans le cadre de votre nouvellefoo()
méthode. Vous pouvez également utiliser la même syntaxe pour accéder aux versions par défaut dans d'autres méthodes de votre classe d'implémentation.Une description formelle de la syntaxe d'appel de méthode peut être trouvée dans le chapitre 15 du JLS .
la source
A extends SomeOtherInterface
, etSomeOtherInterface
satisfairadefault Type method()
, alors vous ne pouvez pas appelerSomeOtherInterface.super.method()
de ChildClass. Vous ne pouvez appeler que les méthodes par défaut des interfaces énumérées dans la clauseChildClass
'simplements
, pas les méthodes de leurs interfaces parentes.super.super.someMethod();
(car ce serait horrible)Le code ci-dessous devrait fonctionner.
Production:
la source
Cette réponse est écrite principalement pour les utilisateurs qui viennent de la question 45047550 qui est fermée.
Les interfaces Java 8 présentent certains aspects de l'héritage multiple. Les méthodes par défaut ont un corps de fonction implémenté. Pour appeler une méthode à partir de la super classe, vous pouvez utiliser le mot-clé
super
, mais si vous voulez faire cela avec une super interface, vous devez le nommer explicitement.Production:
la source
Vous n'avez pas besoin de remplacer la méthode par défaut d'une interface. Appelez-le simplement comme suit:
Production:
la source