2009-06-04 18 views
10

Si lo declaran los métodos de sólo el 2 varargs de la siguiente manera:En Java, ¿por qué la llamada foo() no es ambigua dado 2 métodos de varags foo (int ... ints) y foo (objeto ... objetos)?

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(); 

esto 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"); 
} 

luego el código

foo(); 

llama a la versión enteros del método. ¿Alguien puede explicar por qué el segundo ejemplo no es similarmente ambiguo y por qué se resuelve en el método int sobre el método Object? Gracias.

+1

No ha mostrado las llamadas a foo, sin las cuales esta pregunta es difícil de responder. –

+1

Jon, la llamada a foo() es literalmente foo(), es decir, con cero argumentos. Editaré la pregunta para aclarar esto. – mikej

+0

Con * solo * int ... y objeto ..., esto compila para mí. Con String ... e int ... (pero no Object ...) no es así. ¿Podrías verificar la pregunta por favor? –

Respuesta

29

Si recuerdo correctamente desde que estaba preparando el 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 habilitado (1.5+), int puede ser Integer, que es un subconjunto de Object, y el compilador, en caso de conflicto, siempre usará la definición más específica. Por lo tanto, Integer (int) tiene prioridad.

+6

Esto es correcto. Desde el JLS ... 15.12.2.5 Elegir el método más específico http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12.2.5 – justinhj

4

Java siempre usará el tipo más cercano posible, de modo que cuando ingrese los datos en el método, si no tuviera el método int ... los autopsularía en enteros y usaría el objeto .... Desde allí es un método int ..., Java lo usará primero. Esta es una elección en el diseño del compilador de Java.

+0

Language design .. . –

Cuestiones relacionadas