web-dev-qa-db-fra.com

Pourquoi null lancer un paramètre?

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?

81
pek

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é en Java.lang.String pour un appel varargs
transtypé en Java.lang.String[] pour un appel non varargs et pour supprimer cet avertissement

128

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);

34
Eren Aygunes