Em Java, porque é que o foo call () não ambígua dada 2 VarArgs métodos foo (int ... ints) e foo (Object ... objetos)?

StackOverflow https://stackoverflow.com/questions/951388

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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top