2008-11-24 6 views
80

J'ai vu ce morceau de code quelque part et se demande: quand et pourquoi quelqu'un faire ce qui suit:Pourquoi une distribution nulle?

doSomething((MyClass) null); 

Avez-vous déjà fait cela? Pourriez-vous s'il vous plaît partager votre expérience?

+0

Peut-être juste un codeur inexpérimenté? Ou quelqu'un qui a changé le code de doSomething ((cast) quelque chose); et voulait le changer en null, et ne prenait pas la peine d'enlever la distribution? Est-ce à plus d'un endroit ou juste un exemple? –

+0

Je ne me souviens pas où je l'ai lu, mais j'ai vu cela et j'ai appris que vous pouvez lancer un null sur un objet. Le problème est, je ne peux pas trouver un scénario raisonnable! : P – pek

+0

Copie possible de [Pourquoi cast null à l'objet?] (Http://stackoverflow.com/questions/5806163/why-cast-null-to-object) – Archmede

Répondre

125

Si doSomething est surchargée, vous devez lancer le nul explicitement MyClass si la surcharge de droite est choisi:

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

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

Une situation non artificielle où vous devez jeter 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:

Exemple.java:26: avertissement: non-varargs méthode d'appel de varargs avec inexact type d'argument pour le dernier paramètre;
coulé à java.lang.String pour un varargs appel
casting à java.lang.String[] pour une non-varargs appel et de supprimer ce avertissement

+0

Qu'en est-il de NullPointerException? J'ai trouvé cette réponse, mais je n'ai pas caché un scénario du monde réel pour cela! Avez-vous fait cela? Pourquoi? – pek

+1

Souvent dans les tests unitaires, vous pouvez passer une valeur nulle à une fonction –

+3

Ceci n'est pas associé à NullPointerException. Vous ne déréférencez pas le null. Vous changez juste le type de la référence à MyClass afin que la résul- tance de surcharge puisse trouver la bonne méthode. aygunes fourni un bon exemple où il pourrait être utile –

32

Disons que vous avez ces deux fonctions, et de supposer qu'ils acceptent null comme valide valeur 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 deuxièmes paramètres. Si vous souhaitez utiliser l'un d'entre eux avec un null comme deuxième paramètre, vous devez convertir null en type de 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 la seconde: ShowMessage("Test2", (MyDelegate) null);

Questions connexes