Wenn ich eine vararg Java-Methode habe foo(Object ...arg)
und aufrufe foo(null, null)
, habe ich beide arg[0]
und arg[1]
als null
s. Aber wenn ich anrufe foo(null)
, ist arg
selbst null. Warum passiert dies?
Wie soll ich anrufen , foo
so dass foo.length == 1 && foo[0] == null
ist true
?
null
language-design
java
variadic-functions
Pathikrit
quelle
quelle
asList
Methode in der Stichprobe und ihren Zweck aufgeführt hätten.asList()
ist ein statischer Import aus derjava.util.Arrays
Klasse. Ich habe nur angenommen, dass es offensichtlich ist. Obwohl ich jetzt darüber nachdenke, hätte ich es wahrscheinlich nur verwenden sollen,Arrays.toString()
da der einzige Grund, warum es in eine Liste konvertiert wird, darin besteht, dass es hübsch gedruckt wird.Sie benötigen eine explizite Besetzung für
Object
:Andernfalls wird angenommen, dass das Argument das gesamte Array ist, das die Varargs darstellen.
quelle
Ein Testfall zur Veranschaulichung:
Der Java-Code mit einer vararg-take-Methodendeklaration (die zufällig statisch ist):
Dieser Java-Code (ein JUnit4-Testfall) ruft das Obige auf (wir verwenden den Testfall, um nichts zu testen, nur um eine Ausgabe zu generieren):
Wenn Sie dies als JUnit-Test ausführen, erhalten Sie:
Um dies interessanter zu gestalten, rufen wir die
receive()
Funktion aus Groovy 2.1.2 auf und sehen, was passiert. Es stellt sich heraus, dass die Ergebnisse nicht gleich sind! Dies kann jedoch ein Fehler sein.Wenn Sie dies als JUnit-Test ausführen, erhalten Sie Folgendes, wobei der Unterschied zu Java fett hervorgehoben ist.
quelle
Dies liegt daran, dass eine varargs-Methode mit einem tatsächlichen Array anstelle einer Reihe von Array-Elementen aufgerufen werden kann. Wenn Sie es mit dem Mehrdeutigen
null
an sich versehen, geht es davon aus, dass es sichnull
um ein handeltObject[]
. Durch Casting desnull
toObject
wird dies behoben.quelle
ich bevorzuge
um Nullzeigerausnahmen zu vermeiden.
Ich hoffe es hilft.
quelle
foo()
?Die Reihenfolge für die Auflösung der Methodenüberladung lautet ( https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.12.2 ):
foo(null)
stimmtfoo(Object... arg)
mitarg = null
in der ersten Phase überein .arg[0] = null
wäre die dritte Phase, die nie passiert.quelle