En Java, ¿por qué es la llamada foo () no ambiguas dado 2 varargs métodos foo (int ... enteros) y foo (Object ... objetos)?

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

Pregunta

Si Declaro sólo los 2 métodos varargs como sigue:

public void foo(String... strings) {
    System.out.println("Foo with Strings");
}

y

public void foo(int... ints) {
    System.out.println("Foo with ints");
}

y luego tener el código:

foo();

Este es un error del compilador debido a la ambigüedad como se esperaba.

Sin embargo, si sólo tengo las 2 versiones siguientes de foo:

public void foo(Object... objects) {
    System.out.println("Foo with Objects");
}

y

public void foo(int... ints) {
    System.out.println("Foo with ints");
}

A continuación, el código

foo();

llama a la versión enteros del método. ¿Alguien puede explicar por qué el segundo ejemplo no es igualmente ambigua y por eso se resuelve con el método int con respecto al método de objeto. Gracias.

¿Fue útil?

Solución

Si recuerdo correctamente desde cuando estaba preparando la scjp, en el primer caso tiene 2 argumentos sin relación entre ellos, por lo que el compilador no puede elegir uno.

En el segundo, con el boxeo permitido (1.5 +), puede ser int número entero que es un subconjunto de objetos, y el compilador, en caso de conflicto, siempre utilizará la definición más específica. Así entero (int) se prioriza.

Otros consejos

Java siempre utilizará el tipo más cercano posible, por lo que cuando se pasa enteros en el método, si no tiene la int ... método, sería AUTOBOX por enteros y el uso de objetos .... Puesto que hay un int ... método, Java utilizará la primera. Esta es una opción en el diseño del compilador de Java.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top