2008-11-24 7 views
80

sah ich dieses Stück Code irgendwo und fragte: Wann und warum sollte jemand wie folgt vorgehen:Warum null Besetzung?

doSomething((MyClass) null); 

Haben Sie jemals das getan? Könnten Sie bitte Ihre Erfahrungen teilen?

+0

Vielleicht nur ein unerfahrener Coder? Oder jemand, der den Code von doSomething ((Cast) etwas) geändert hat; und wollte es auf null ändern, und kümmerte sich einfach nicht darum, die Besetzung zu entfernen? Gibt es mehr als einen Ort oder nur eine Instanz? –

+0

Ich kann mich nicht erinnern, wo ich es gelesen habe, aber ich habe das gesehen und gelernt, dass man eine Null auf ein Objekt werfen kann. Das Problem ist, ich kann kein vernünftiges Szenario finden! : P – pek

+0

Mögliches Duplikat von [Warum null auf Objekt werfen?] (Http://stackoverflow.com/questions/5806163/why-cast-null-to-object) – Archmede

Antwort

125

Wenn doSomething überlastet ist, müssen Sie die Null explizit MyClass so die richtige Überlastung gewählt würfen

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

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

Eine nicht erfundene Situation, wo Sie werfen müssen, wenn Sie eine varargs Funktion aufrufen:

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

die letzte Zeile wird die folgende Warnung erzeugen:

Example.java:26: Warnung: non-varargs Aufruf der Varargs-Methode mit ungenauer Argumentart für letzten Parameter;
cast java.lang.String für einen varargs Anruf
cast java.lang.String[] für einen nicht-varargs Anruf und diese

Warnung
+0

Was ist mit NullPointerException? Ich habe diese Antwort gefunden, aber ich habe kein realistisches Szenario dafür gemacht! Hast du das gemacht? Warum? – pek

+1

In Unit-Tests können Sie oft Null an eine Funktion übergeben –

+3

Dies ist nicht mit NullPointerException verbunden. Du neutralisierst die Null nicht. Sie ändern nur den Typ des Verweises auf MyClass, damit Überladungsresultierung die richtige Methode finden kann. Aygunes lieferte ein gutes Beispiel dafür, wo es nützlich sein könnte –

32

Angenommen, Sie haben diese beiden Funktionen zu unterdrücken, und gehen davon aus, dass sie null als gültig akzeptiert Wert für die zweiten Parameter.

void ShowMessage(String msg, Control parent);
void ShowMessage(String msg, MyDelegate callBack);

Diese beiden Verfahren unterscheiden sich nur durch die Art ihrer zweiten Parameter. Wenn Sie einen von ihnen mit einem null als zweiten Parameter verwenden möchten, müssen Sie die null auf den Typ des zweiten Arguments der entsprechenden Funktion umwandeln, damit der Compiler entscheiden kann, welche Funktion aufgerufen werden soll.

die erste Funktion aufzurufen: ShowMessage("Test", (Control) null);
Zum zweiten: ShowMessage("Test2", (MyDelegate) null);