L'appel de Java varargs méthode avec un seul argument null?
Si j'ai un vararg méthode Java foo(Object ...arg)
et j'appelle foo(null, null)
, j'ai à la fois arg[0]
et arg[1]
comme null
s. Mais si je l'appelle foo(null)
, arg
lui-même est nulle. Pourquoi est-ce arrivé?
Comment dois-je appeler foo
tels que foo.length == 1 && foo[0] == null
est true
?
Vous devez vous connecter pour publier un commentaire.
Le problème est que lorsque vous utilisez le littéral null, Java ne sait pas de quel type il est censé être. Il pourrait être un Objet nul, ou peut-être un Objet null tableau. Pour un seul argument qu'elle assume ce dernier.
Vous avez deux choix. Fonte le null explicitement pour Objet ou appelez la méthode utilise un typage fort variable. Voir l'exemple ci-dessous:
De sortie:
asList
méthode dans l'échantillon, et de son but.java.util.Arrays
classe. J'ai juste supposé que c'était évident. Bien que maintenant que je suis en train de penser à ce sujet, je devrais probablement justeArrays.toString()
puisque la seule raison qu'il est converti en une Liste en est ainsi, il permet d'imprimer jolie.Vous avez besoin d'un cast explicite
Object
:Sinon, l'argument est supposé être à l'ensemble du tableau que les varargs représente.
Un Cas de Test pour l'illustrer:
Le code Java avec un vararg méthode de prise de déclaration (qui se trouve être statique):
Ce code Java (un JUnit4 cas de test) appelle le ci-dessus (nous utilisons le test de ne pas tester n'importe quoi, juste pour générer de la puissance de sortie):
L'exécution de cette comme un test JUnit rendements:
De le rendre plus intéressant, nous allons l'appeler le
receive()
fonction de Groovy 2.1.2 et voir ce qui se passe. Il s'avère que les résultats ne sont pas les mêmes! Cela peut être un bug si.L'exécution de cette comme un test JUnit rendements suivants, à la différence de Java en caractères gras.
C'est parce que les varargs méthode peut être appelée avec un tableau réel plutôt que d'une série d'éléments du tableau. Lorsque vous fournissez avec l'ambiguïté de la
null
par lui-même, il suppose que l'null
est unObject[]
. Le Casting dunull
àObject
allons résoudre ce problème.Je préfère
pour éviter de pointeur Null exceptions.
Espère que cela aide.
foo()
?De la commande pour la surcharge de méthode de résolution 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.