2009-06-04 6 views
10

Si je déclare seulement les 2 méthodes varargs comme suit:En Java, pourquoi l'appel foo() n'est-il pas ambigieux étant donné 2 méthodes varags foo (int ... ints) et foo (Object ... objects)?

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

et

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

et ensuite le code:

foo(); 

ceci est une erreur de compilation en raison de l'ambiguïté comme prévu.

Cependant, si je seulement les 2 versions suivantes de foo:

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

et

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

alors le code

foo(); 

appelle la version ints de la méthode. Quelqu'un peut-il expliquer pourquoi le second exemple n'est pas ambigu de même et pourquoi il résout à la méthode int sur la méthode Object. Merci.

+1

Vous n'avez pas montré les appels à foo, sans lesquels cette question est difficile à répondre. –

+1

Jon, l'appel à foo() est littéralement foo() c'est-à-dire avec zéro argument. Je vais éditer la question pour la rendre plus claire. – mikej

+0

Avec * just * int ... et objet ..., cela compile pour moi. Avec String ... et int ... (mais pas Object ...) ce n'est pas le cas. Pourriez-vous vérifier la question s'il vous plaît? –

Répondre

29

Si je me souviens correctement de quand je préparais le scjp, dans le premier cas, vous avez 2 arguments sans relation entre eux, de sorte que le compilateur ne peut pas en choisir un. Dans la seconde, avec boxing activé (1.5+), int peut être Integer qui est un sous-ensemble d'Object, et le compilateur, en cas de conflit, utilisera toujours la définition la plus spécifique. Donc Integer (int) est prioritaire.

+6

Ceci est correct. À partir du JLS ... 15.12.2.5 Choix de la méthode la plus spécifique http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12.2.5 – justinhj

4

Java utilisera toujours le type le plus proche possible, donc quand vous passez dans la méthode, si vous n'avez pas la méthode int ..., elle les autoboxerait en entiers et utiliserait Object. est une méthode int ..., Java l'utilisera en premier. C'est un choix dans la conception du compilateur Java.

+0

Conception de la langue .. . –

Questions connexes