In Java, perché è la foo chiamata () non ambigue date 2 varargs metodi foo (int ... int) e foo (Object ... oggetti)?

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

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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top