Olá Pessoal,
Achei um comportamento bem estranho em um teste de sobrecarga de método com herança de classe e uma interface que fiz.
Para mim, o comportamento dos dois blocos de código, entre sí, que postarei abaixo parece bastante incoerente.
Alguém saberia me explicar o que está acontecendo ?
Bloco 1 (pai (Classe A) e filho (Classe B) implementam a interface):
interface IntF { }
class A implements IntF{ }
class B extends A implements IntF { }
public class OverloadTest {
public void method(A a_obj) { System.out.println("A"); }
public void method(IntF intf_obj) { System.out.println("IntF"); }
public static void main(String[] args) {
OverloadTest teste = new OverloadTest();
B obj = new B();
teste.method(obj);
}
}
Neste Bloco 1 a saída é: A
Sem erros de compilação, execução ou qualquer warning.
Desta forma, parece que a JVM preferiu usar o método com a classe A na assinatura ao invés do método com a interface na assinatura.
Vamos ao Bloco 2 (apenas o filho (Classe B) implementa a interface):
(Vale ressaltar que o Bloco 2 é exatamente igual ao Bloco 1, exceto pelo fato que agora Class A não mais implementa a interface)
interface IntF { }
class A { }
class B extends A implements IntF { }
public class OverloadTest {
public void method(A a_obj) { System.out.println("A"); }
public void method(IntF intf_obj) { System.out.println("IntF"); }
public static void main(String[] args) {
OverloadTest teste = new OverloadTest();
B obj = new B();
teste.method(obj);
}
}
Neste Bloco 2 a saída é: Erro de compilação:
Exception in thread “main” java.lang.Error: Unresolved compilation problem:
The method method(A) is ambiguous for the type OverloadTest
at OverloadTest.main(OverloadTest.java:14)
Bem, agora parece que o compilador se perdeu e não saberia mais qual método usar. Mas o que importa para o compilador se a classe pai A usa a mesma interface do filho ? Afinal o filho continua sendo subtipo de A e implementando a interface IntF, exatamente como no Bloco 1. Porque agora o compilador se perde e antes não ?
Bom, fica aí o que pra mim é um enigma. Aprecio comentários ou possíveis explicações sobre o fato.
Obs: os códigos acima são integrais, todo o código encontra-se em um mesmo arquivo. A versão utilizada é Java 6.
Abraços !