In Java, perché è la foo chiamata () non ambigue date 2 varargs metodi foo (int ... int) e foo (Object ... oggetti)?
-
11-09-2019 - |
Domanda
Se io dichiaro solo i metodi 2 varargs come segue:
public void foo(String... strings) {
System.out.println("Foo with Strings");
}
e
public void foo(int... ints) {
System.out.println("Foo with ints");
}
e quindi avere il codice:
foo();
questo è un errore di compilatore causa dell'ambiguità come previsto.
Tuttavia, se ho solo i seguenti 2 versioni di foo:
public void foo(Object... objects) {
System.out.println("Foo with Objects");
}
e
public void foo(int... ints) {
System.out.println("Foo with ints");
}
quindi il codice
foo();
chiama la versione int del metodo. Qualcuno può spiegare perché il secondo esempio non è allo stesso modo ambiguo e perché si risolve con il metodo int rispetto al metodo oggetto. Grazie.
Soluzione
Se ricordo correttamente da quando stavo preparando lo SCJP, nel primo caso si hanno 2 argomenti con alcuna relazione tra di loro, in modo che il compilatore non può scegliere uno.
Nel secondo, con inscatolamento abilitato (1.5 +), int può essere un numero intero che è un sottoinsieme di oggetti, e il compilatore, in caso di conflitto, sarà sempre utilizzare la definizione più specifica. Così intero (int) è la priorità.
Altri suggerimenti
Java utilizzerà sempre il tipo più vicino possibile, in modo che quando si passa interi nel metodo, se non avete l'int ... metodo, li avrebbe autobox in numeri interi e utilizzare oggetti .... Dal momento che non v'è un int ... metodo, Java userà quel primo. Questa è una scelta nella progettazione compilatore Java.