Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Interface com métodos iguais, mas tipos diferentes

No vídeo ele fala que não tem problema estender de mais de uma interface, mesmo se as interfaces tiverem métodos com o mesmo nome, pois por serem abstratas, ira executar o mesmo método, mas e se a classe estender de duas interfaces, com métodos iguais mas tipos ( tanto de retorno quanto parâmetros da função) diferentes? Qual vai ser executada na hora de chamar o método com o mesmo nome?

Eu fiz um teste e vi que o eclipse pede para ambos os métodos serem implementados, mas apenas um é executado. Se em um sistema real, com uma complexidade muito grande, ocorrer de ter duas interfaces com métodos de mesmo nome, mas tipos diferentes, existe uma solução para escolher qual método será executado? Ou a unica solução é mudar o nome dos métodos?

3 respostas

Fala Yan, tudo bem?

O que é importante entender é que não é apenas pelo nome do método que é definido qual será chamado. Existe o conceito que chamamos de "assinatura de método" que consiste no nome do método + tipos de parâmetros. Em Java, não é possível declarar dois métodos com o mesmo nome e com os mesmos tipos de parâmetros! É justamente por isso que é possível saber qual método será chamado em runtime :)

Abraço!

Vou dar um exemplo com o código pois acho que minha pergunta não ficou clara.

Tenho duas interfaces, com métodos de mesmo nome mas assinaturas diferentes, como mostro a seguir.

public interface Autenticavel1 {    

    boolean autentica(int senha);

}
public interface Autenticavel2 {    

     double autentica(double senha);

}

Ao criar uma classe que extende essas duas interfaces, o eclipse automaticamente pede para implementar ambas as classes, gerando o seguinte código:

public class Gerente implements Autenticavel, Autenticavel2 {

        @Override
    public boolean autentica(int senha) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public double autentica(double senha) {
        // TODO Auto-generated method stub
        return 0;
    }

}

E minha pergunta é sobre como saber qual método sera executado caso eu chame o método autentica? Como diferenciar um método do outro? O java tem algum algorítimo para diferenciar?

OBS: Esse exemplo de código mostrado a cima é um exemplo muito simples de ser resolvido e é apenas para mostrar os métodos com mesmo nome e assinatura diferente, mas caso aconteça essa situação em um sistema muito grande e muito complexo, qual seria a solução supondo que uma situação como essa ocorra?

solução!

Isso se chama sobrecarga de métodos, o java identifica qual deles deve chamar através dos argumentos recebidos.

Se passar um int como argumento ele chama o primeiro método, se for um double ele chama o segundo.

Essa técnica funciona em qualquer classe, não necessariamente se trata de interfaces.