Java 3 points de paramètre (varargs) comportement lorsqu'il est passé sans arguments ou null
J'ai essayé et pour obtenir le comportement bizarre de JAVA, quelqu'un peut m'expliquer ce pour moi?
boolean testNull(String... string) {
if(string == null) {
return true;
} else {
System.out.println(string.getClass());
return false;
}
}
boolean callTestNull(String s) {
return testNull(s);
}
Puis j'ai des cas de test:
@Test
public void test_cases() {
assertTrue(instance.testNull(null)); //NULL
assertFalse(instance.testNull()); //NOT NULL
assertFalse(instance.callTestNull(null)); //NOT NULL
}
La question est de savoir si je l'appelle testNull()
directement avec le paramètre null
, je vais obtenir true
, mais s'appel callTestNull()
avec null
, qui appelle testNull()
, il me dit que le paramètre n'est pas nulle, mais vide.
- Comment trouvez-vous que la pile est-elle vide?
- également appelés points de suspension
- Je voulais dire en termes de terminologie de Java. Mais oui, le caractère "..." est en effet appelé points de suspension. Plus d'infos sur la programmation de l'utiliser ici en.wikipedia.org/wiki/Ellipsis_(programming_operator)
- Double Possible de Java, 3 points dans paramètres
Vous devez vous connecter pour publier un commentaire.
Oui. Si vous appelez avec un argument avec un le type de compilation de
String
, le compilateur sait que ne peut pas être unString[]
, il l'enroule dans un tableau de chaînes. Donc:est équivalent à:
À ce stade, le (faussement nommé)
string
paramètre aura une valeur non-null - au lieu de cela, il va se référer à un tableau de taille 1, et dont l'unique élément est une référence null.Toutefois, lorsque vous utilisez le
null
littérale directement dans l'appel de méthode, c'est directement convertible pourString[]
, donc pas d'emballage est effectué.De JLS section 15.12.4.2:
(C'est moi qui souligne.)
Le peu que j'ai souligné, c'est pourquoi l'emballage seulement se produit lorsque le moment de la compilation du type de l'argument est
String
, pas le type null.