O Java 8 apresenta métodos padrão para fornecer a capacidade de estender interfaces sem a necessidade de modificar implementações existentes.
Gostaria de saber se é possível invocar explicitamente a implementação padrão de um método quando esse método foi substituído ou não está disponível devido a implementações padrão conflitantes em diferentes 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?
}
}
Considerando o código acima, como você chamaria A.foo()
de um método da classe B?
Respostas:
Conforme este artigo, você acessa o método padrão na interface
A
usandoIsso pode ser usado da seguinte maneira (assumindo interfaces
A
eC
ambos têm métodos padrãofoo()
)A
eC
ambos podem ter.foo()
métodos e a implementação padrão específica pode ser escolhida ou você pode usar um (ou ambos) como parte do seu novofoo()
método. Você também pode usar a mesma sintaxe para acessar as versões padrão em outros métodos em sua classe de implementação.A descrição formal da sintaxe de chamada do método pode ser encontrada no capítulo 15 do JLS .
fonte
A extends SomeOtherInterface
, eSomeOtherInterface
possuidefault Type method()
, você não pode simplesmente ligarSomeOtherInterface.super.method()
do ChildClass. Você pode chamar apenas métodos padrão de interfaces enumerados na cláusulaChildClass
'simplements
, não os métodos de suas interfaces pai.super.super.someMethod();
(porque isso seria horrível)O código abaixo deve funcionar.
Resultado:
fonte
Esta resposta foi escrita principalmente para usuários provenientes da pergunta 45047550, que está encerrada.
As interfaces Java 8 apresentam alguns aspectos da herança múltipla. Métodos padrão tem um corpo de função implementado. Para chamar um método da superclasse, você pode usar a palavra-chave
super
, mas se quiser fazer isso com uma super interface, é necessário nomeá-lo explicitamente.Resultado:
fonte
Você não precisa substituir o método padrão de uma interface. Basta chamá-lo da seguinte maneira:
Resultado:
fonte