En Java, pourquoi est le foo d'appel () non ambigus donnés 2 méthodes VarArgs foo (int ... ints) et foo (Object ... objets)?

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

Question

Si je déclare seulement les 2 méthodes varargs comme suit:

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

et

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

et alors le code:

foo();

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

Toutefois, si j'ai juste les 2 versions de foo suivantes:

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 est pas de la même ambiguë et pourquoi il décide de la méthode int sur la méthode de l'objet. Merci.

Était-ce utile?

La solution

Si je me souviens bien du moment où je préparais le SCJP, dans le premier cas, vous avez 2 arguments sans rapport entre eux, de sorte que le compilateur ne peut pas choisir un.

Dans la seconde, avec la boxe activé (1.5+), int peut être entier qui est un sous-ensemble d'objets, et le compilateur, en cas de conflit, toujours utiliser la définition plus spécifique. Alors entier (int) est priorisé.

Autres conseils

Java utilise toujours le type le plus proche possible, de sorte que lorsque vous passez ints dans la méthode, si vous n'avez pas l'int ... méthode, il les AutoBox dans Entiers et utiliser l'objet .... Comme il est un int ... méthode, Java utilisera cette première. Ce choix dans la conception du compilateur Java.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top