Warum bekomme ich hier eine Kompilierungswarnung (var args Methodenaufruf in Java)
Quelle:
public class TestVarArgs {
public void varArgsMethod(Object ... arr) {
System.out.println(arr.getClass().getName());
for(Object o : arr) {
System.out.println(o);
}
}
public static void main(String[] args) {
TestVarArgs tva = new TestVarArgs();
tva.varArgsMethod(args);
}
}
Kompilieren:
javac TestVarArgs.java
Fehler:
TestVarArgs.java:15: warning: non-varargs call of varargs method with inexact argument type for last parameter;
cast to java.lang.Object for a varargs call
cast to java.lang.Object[] for a non-varargs call and to suppress this warning
tva.varArgsMethod(args);
^
1 warning
Ich bin mit javac 1.6.0_20
und den code für o/p zeigt an, dass eine nicht var arg Anruf getätigt wurde sowieso.
Kommentar zu dem Problem
@downvoter bitte Pflege, Stellung zu nehmen.Trotzdem habe ich es ausgeglichen 😀
InformationsquelleAutor der Frage abc | 2013-07-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist, weil
String[]
undObject...
nicht genau übereinstimmen.Haben Sie zum cast der
String[]
entwederObject[]
(wenn Sie möchten, übergeben Sie die Saiten, als separate Parameter) oderObject
(wenn Sie wollen nur ein argument, das ist ein array).Warum ist das eine Warnung und kein Fehler? Rückwärts-Kompatibilität. Vor der Einführung von varargs, Sie hatte diese Methoden nehmen eine
Object[]
und code kompiliert, sollte noch funktionieren auf die gleiche Weise nach der Methode wurde aktualisiert varargs. Die JDK-standard-Bibliothek ist voll von solchen Fällen. Zum Beispieljava.util.Arrays.asList(Object[])
verändert hatjava.util.Arrays.asList(Object...)
in Java5 und alle alten code verwendet, sollte es noch kompiliert und funktioniert ohne änderungen.InformationsquelleAutor der Antwort Thilo
Dem argument des Typs
String[]
sollte explizit umgewandelt werdenObject[]
für den Aufruf von varargs-MethodevarArgsMethod(Object...)
vom Typ TestVarArgs. Es könnte alternativ eine Umwandlung in Objekt für eine varargs-AufrufSie können das Problem beheben, indem Sie eine eine Möglichkeit
Wenn Sie die Umwandlung der
String[]
zuObject[]
(ref:tva.varArgsMethod((Object[])args);
)ODER
ändern Sie den parameter der Methode zu
String[]
(ref:
public void varArgsMethod(String ... paramArr)
)InformationsquelleAutor der Antwort Freak
Ändern Sie die Methode wie
InformationsquelleAutor der Antwort MGPJ
Einem der eleganten Möglichkeiten, um loszuwerden off diese Warnung:
statt
tva.varArgsMethod(args)
rufen
tva.varArgsMethod(Arrays.stream(args).toArray())
explizit zeigen, dass Sie mehrere Argumente übergeben.
InformationsquelleAutor der Antwort Andrushenko Alexander