En réalité,
private static void f(Object... objects)
est compilé comme
private static void f(Object[] objects)
si t'as un bon IDE, sur ton appel, tu devrais voir ceci:
The argument of type null should explicitly be cast to Object[] for the invocation of the varargs method f(Object...) from type Main. It could alternatively be cast to Object for a varargs invocation
Ce qu'essaie de te dire l'IDE, c'est qu'il y a peut être ambiguité dans le chef du programmeur. Cet appel peut être interprété de deux manières:
1 2
| f((Object[])null);
f((Object)null); |
Le premier étant celui que prendra la JVM en appliquant les règles de la JLS. En conséquence, sur cet appel, objects est null dans f, d'ou ton exception quand tu appelle f.length.
Il faut être prudent avec les ellipses, particulièrement quand on leur passe un null ou un Object[]. De la même manière, prudence lorsqu'on utilise simultanément l'éllipse et une méthode aux arguments similaires qui utiliser un tableau!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public class Main {
private static void f(String key, Object... objects) {
System.out.print(key+": ");
if (objects!=null)
System.out.println(objects.length + " argument(s): "+Arrays.deepToString(objects));
else
System.out.println("objects vaut null!");
}
public static void main(String[] args) {
Object obj = null;
Object[] tableau = new Object[]{"un","deux"};
f("vide");
f("object null",obj);
f("deux nulls",null, null);
f("tableau",tableau);
f("(Object)tableau",(Object)tableau);
f("null",null);
f("(Object)null",(Object)null);
f("(Object[])null",(Object[])null);
}
} |
Partager