Em Java, porque é que o foo call () não ambígua dada 2 VarArgs métodos foo (int ... ints) e foo (Object ... objetos)?
-
11-09-2019 - |
Pergunta
Se eu declarar apenas 2 varargs métodos da seguinte forma:
public void foo(String... strings) {
System.out.println("Foo with Strings");
}
e
public void foo(int... ints) {
System.out.println("Foo with ints");
}
e, em seguida, ter o código:
foo();
este é um erro do compilador devido à ambigüidade como esperado.
No entanto, se eu tenho apenas as 2 versões seguintes do foo:
public void foo(Object... objects) {
System.out.println("Foo with Objects");
}
e
public void foo(int... ints) {
System.out.println("Foo with ints");
}
então o código
foo();
chama a versão ints do método. Alguém pode explicar por que o segundo exemplo não é igualmente ambíguo e porque ele resolve para o método int sobre o método de objeto. Obrigado.
Solução
Se me lembro bem de quando eu estava preparando o SCJP, no primeiro caso, você tem 2 argumentos com nenhuma relação entre eles, de modo que o compilador não pode escolher um.
Na segunda, com o boxe habilitado (1.5+), int pode ser Integer que é um subconjunto do objeto, e o compilador, em caso de conflito, sempre usará a definição mais específica. Então Integer (int) é priorizado.
Outras dicas
Java usará sempre o tipo mais próximo possível, então quando você passar ints para o método, se você não tem o int ... método, seria Autobox los em números inteiros e uso de objetos .... Uma vez que existe um int ... método, Java vai usar isso em primeiro lugar. Esta é uma escolha na concepção do compilador Java.