82 votes

Pourquoi null cast un paramètre ?

Quand et pourquoi quelqu'un ferait ce qui suit :

doSomething( (MyClass) null );

Avez-vous déjà fait ça ? Pouvez-vous partager votre expérience ?

0 votes

Peut-être juste un codeur inexpérimenté ? Ou quelqu'un qui a modifié le code de doSomething((cast)something) ; et voulait le changer en null, et n'a pas pris la peine de supprimer le cast ? Le problème est-il présent à plusieurs endroits ou à une seule instance ?

0 votes

Je ne me souviens plus où je l'ai lu, mais j'ai vu ceci et j'ai appris que l'on peut transformer un null en objet. Le problème est que je n'arrive pas à trouver un scénario raisonnable ! :P

0 votes

Il ne s'agit pas d'un jet nul. Il n'y a rien de tel. C'est un moulage d'un nul. Totalement l'opposé. Votre titre original était meilleur.

128voto

Johannes Schaub - litb Points 256113

Si doSomething est surchargé, vous devez convertir explicitement le null en MyClass afin de choisir la bonne surcharge :

public void doSomething(MyClass c) {
    // ...
}

public void doSomething(MyOtherClass c) {
    // ...
}

Une situation non-contrariée où vous devez effectuer un casting 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 de la méthode non-varargs appel de la méthode varargs avec un type type d'argument inexact pour le dernier paramètre ;
pour java.lang.String pour une varargue appeler
pour java.lang.String[] pour un non-varargs et de supprimer cet avertissement

0 votes

Qu'en est-il de NullPointerException ? J'ai trouvé cette réponse, mais je n'ai pas trouvé de scénario réel pour cela ! L'avez-vous fait ? Pourquoi ?

2 votes

Souvent dans les tests unitaires, vous pouvez passer null à une fonction

3 votes

Ce n'est pas lié à l'exception NullPointerException. Vous ne déréférencez pas le null. Vous changez simplement le type de la référence à MyClass pour que la résolution de surcharge puisse trouver la bonne méthode. aygunes a fourni un bon exemple où cela pourrait être utile.

34voto

aygunes Points 691

Disons que vous avez ces deux fonctions, et supposons qu'elles acceptent null comme une 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 voulez utiliser l'une d'entre elles avec un paramètre de type null en tant que second paramètre, vous devez convertir le null au type du second argument de la fonction correspondante, afin que le compilateur puisse décider de la fonction à appeler.

Pour appeler la première fonction : ShowMessage("Test", (Control) null);
Pour le second : ShowMessage("Test2", (MyDelegate) null);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X