Der folgende Code verwendet einfach eine Nullreferenz als Varargs-Parameter.
%Vor% Der erste Aufruf der Methode temp(null, null);
zeigt an [null, null]
bedeutet, dass str[0]=null
und str[1]=null
.
, aber der spätere Aufruf von temp(null);
bewirkt, dass die NullPointerException
ausgelöst wird, die aussieht, als wäre str
selbst null
.
Wenn der Typ in String
wie etwa temp((String)null);
umgewandelt wird, funktioniert es und zeigt [null]
an.
Warum ist beim letzten Aufruf eine explizite Typumwandlung erforderlich? Es scheint mir, dass es sich um ein String-Array mit einer null
-Referenz handelt, die sich vom ersten Aufruf unterscheidet. Was ist die richtige Antwort?
Es scheint mir, dass es sich um ein String-Array mit einer Null handelt Referenz, die sich vom ersten Aufruf unterscheidet
Genau. Das ist was passiert.
Eigentlich geht es nur um precedence
zwischen: - exact-match
, var-args
, boxing
und type-casting
.
Der Compiler folgt der folgenden Rangfolge, wenn nach Methoden gesucht wird, die aufgerufen werden sollen oder wie das Argument übergeben wird: -
Genau passend & gt; Typ-Cast & gt; Boxen & gt; Var-Argumente
Sie können also sehen, dass var-args
die niedrigste Priorität hat und exact-match
die höchste Priorität hat. Das heißt, wenn ein argument
% good-enough
für ein exact-match
ist, wird dies als solches betrachtet.
Wenn Sie nun null
als Argument übergeben, kann null
direkt an den Parameter var-args
als value of reference
übergeben werden. Es ist ein exact match
für den Parameter.
Also müssen Sie typecast
explizit auf String
setzen, um zu sagen, dass dies tatsächlich das erste Element Ihres var-args
-Parameters
Im Fall von null, null
wird dies als two
Elemente von var-args
verwendet. Es kann kein value of reference
sein.
Tags und Links java variadic-functions