Quand et pourquoi quelqu'un ferait-il ce qui suit:
doSomething( (MyClass) null );
Avez-vous déjà fait ça? Pourriez-vous s'il vous plaît partager votre expérience?
Si doSomething
est surchargé, vous devez convertir le null explicitement en MyClass
afin que la bonne surcharge soit choisie:
public void doSomething(MyClass c) {
// ...
}
public void doSomething(MyOtherClass c) {
// ...
}
Une situation non artificielle où vous devez effectuer un cast est lorsque vous appelez une fonction varargs:
class Example {
static void test(String code, String... s) {
System.out.println("code: " + code);
if(s == null) {
System.out.println("array is null");
return;
}
for(String str: s) {
if(str != null) {
System.out.println(str);
} else {
System.out.println("element is null");
}
}
System.out.println("---");
}
public static void main(String... args) {
/* the array will contain two elements */
test("numbers", "one", "two");
/* the array will contain zero elements */
test("nothing");
/* the array will be null in test */
test("null-array", (String[])null);
/* first argument of the array is null */
test("one-null-element", (String)null);
/* will produce a warning. passes a null array */
test("warning", null);
}
}
La dernière ligne produira l'avertissement suivant:
Example.Java:26: avertissement: appel non varargs de la méthode varargs avec un type d'argument inexact pour le dernier paramètre;
transtypé enJava.lang.String
pour un appel varargs
transtypé enJava.lang.String[]
pour un appel non varargs et pour supprimer cet avertissement
Supposons que vous ayez ces deux fonctions et supposons qu'elles acceptent null
comme valeur valide pour les seconds paramètres.
void ShowMessage(String msg, Control parent);
void ShowMessage(String msg, MyDelegate callBack);
Ces deux méthodes ne diffèrent que par le type de leurs seconds paramètres. Si vous souhaitez utiliser l'un d'eux avec un null
comme deuxième paramètre, vous devez convertir le null
en type de deuxième argument de la fonction correspondante, afin que le compilateur puisse décider quelle fonction appel.
Pour appeler la première fonction: ShowMessage("Test", (Control) null);
Pour le second: ShowMessage("Test2", (MyDelegate) null);