Il seguente codice non viene compilato.Vararg in overloading dei metodi in Java
package varargspkg;
public class Main {
public static void test(int... i) {
for (int t = 0; t < i.length; t++) {
System.out.println(i[t]);
}
System.out.println("int");
}
public static void test(float... f) {
for (int t = 0; t < f.length; t++) {
System.out.println(f[t]);
}
System.out.println("float");
}
public static void main(String[] args) {
test(1, 2); //Compilation error here quoted as follows.
}
}
Viene generato un errore in fase di compilazione.
riferimento al test è ambigua, sia metodo di prova (int ...) in varargspkg.Main e metodo di prova (float ...) in varargspkg.Main partita
sembra essere evidenti perché i valori dei parametri del metodo chiamano test(1, 2);
può essere promosso a int
nonché float
Se uno o entrambi i parametri vengono suffisso F
o f
, compila.
Se tuttavia, rappresentano i parametri di ricezione nella firma metodo di rispettivi tipi involucro come segue
public static void test(Integer... i) {
System.out.println("Integer" + Arrays.asList(i));
}
public static void test(Float... f) {
System.out.println("Float" + Arrays.asList(f));
}
quindi la chiamata al metodo test(1, 2);
non emette alcun errore di compilazione. Il metodo da invocare in questo caso è quello che accetta un parametro varargs Integer
(il primo nello snippet precedente).
Perché è in questo caso l'errore come nel primo caso non segnalato? Sembra che sia stata applicata la promozione automatica del tipo di auto-boxing e quella automatica qui. Il box automatico viene applicato per primo in modo che l'errore sia risolto?
la documentazione Oracle dice,
In generale, non si dovrebbe sovraccaricare un metodo varargs, o sarà difficile per i programmatori di capire quale sovraccarico ottiene chiamato.
L'ultima frase in questo link. È tuttavia nell'interesse di una migliore comprensione delle vararg.
Anche per aggiungere codice sotto compila bene.
public class OverLoading {
public static void main(String[] args) {
load(1);
}
public static void load(int i) {
System.out.println("int");
}
public static void load(float i) {
System.out.println("float");
}
}
EDIT:
che segue è la snap shot che indica l'errore di compilazione. Ho creato una nuova applicazione, quindi il nome del pacchetto è diverso.
sto usando JDK 6.
Il codice originale funziona correttamente per me.L'output era int – techfoobar
@techfoobar - Il codice nel primo frammento non viene compilato per me (con jdk 6, NetBeans 6.9.1). Produce l'errore di compilazione come specificato. Ti sta davvero compilando? – Tiny
Buona domanda. Vorrei aggiungere che viene risolto quando sovrascriviamo il singolo parametro (int) e (float). Sento odore di bug qui. –