Si j'ai une méthode Java vararg foo(Object ...arg)
et que j'appelle foo(null, null)
, j'ai les deux arg[0]
et arg[1]
comme null
s. Mais si j'appelle foo(null)
, arg
lui-même est nul. Pourquoi cela arrive-t-il?
Comment dois - je appeler foo
ce qui foo.length == 1 && foo[0] == null
est true
?
null
language-design
java
variadic-functions
pathikrit
la source
la source
asList
méthode dans l'échantillon et son objectif.asList()
est une importation statique de lajava.util.Arrays
classe. J'ai juste supposé que c'était évident. Bien que maintenant que j'y pense, j'aurais probablement dû l'utiliserArrays.toString()
car la seule raison pour laquelle il est converti en liste est qu'il s'imprimera assez.Vous avez besoin d'un casting explicite pour
Object
:Sinon, l'argument est supposé être le tableau entier que représente les varargs.
la source
Un cas de test pour illustrer ceci:
Le code Java avec une déclaration de méthode prenant vararg (qui se trouve être statique):
Ce code Java (un cas de test JUnit4) appelle ce qui précède (nous utilisons le cas de test pour ne rien tester, juste pour générer une sortie):
L'exécuter en tant que test JUnit donne:
Pour rendre cela plus intéressant, appelons la
receive()
fonction de Groovy 2.1.2 et voyons ce qui se passe. Il s'avère que les résultats ne sont pas les mêmes! Cela peut cependant être un bug.L'exécution de ceci en tant que test JUnit donne les résultats suivants, la différence avec Java étant mise en évidence en gras.
la source
En effet, une méthode varargs peut être appelée avec un tableau réel plutôt qu'avec une série d'éléments de tableau. Lorsque vous lui fournissez l'ambiguïté
null
par lui-même, il suppose quenull
c'est unObject[]
. Lancer lenull
versObject
résoudra ce problème.la source
je préfère
pour éviter les exceptions de pointeur Null.
J'espère que ça aide.
la source
foo()
?L'ordre pour la résolution de surcharge de méthode est ( https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.12.2 ):
foo(null)
correspondfoo(Object... arg)
avecarg = null
dans la première phase.arg[0] = null
serait la troisième phase, qui n'arrive jamais.la source