2008-11-24 24 views
80

vi este pedazo de código en algún lugar y se preguntó: cuándo y por qué alguien haría lo siguiente:¿Por qué null cast?

doSomething((MyClass) null); 

¿Alguna vez has hecho esto? ¿Podría compartir su experiencia?

+0

Tal vez sólo un codificador sin experiencia? O alguien que cambió el código de doSomething ((fundido) algo); y quería cambiarlo a nulo, y simplemente no se molestó en eliminar el elenco? ¿Está en más de un lugar o solo en una instancia? –

+0

No recuerdo dónde lo leí, pero lo vi y descubrí que puedes lanzar un nulo a un objeto. El problema es que no puedo encontrar un escenario razonable. : P – pek

+0

Posible duplicado de [¿Por qué lanzar nulo al objeto?] (Http://stackoverflow.com/questions/5806163/why-cast-null-to-object) – Archmede

Respuesta

125

Si doSomething está sobrecargado, lo que necesita para emitir la hipótesis nula de manera explícita a MyClass modo se elige la sobrecarga derecha:

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

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

una situación de no artificial donde tiene que CAST es cuando se llama a una función 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 última línea producirá la siguiente advertencia:

Example.java:26: warning: non-varargs método call of varargs con inexacto tipo de argumento para el último parámetro;
fundido a java.lang.String para un varargs llamada
fundido a java.lang.String[] para una llamada no varargs y para suprimir este advertencia

+0

¿Qué pasa con NullPointerException? ¡Encontré esta respuesta, pero no defendí un escenario del mundo real para esto! ¿Has hecho esto? ¿Por qué? – pek

+1

A menudo, en pruebas unitarias puede pasar nulo a una función –

+3

Esto no está relacionado con NullPointerException. No desreferencia el nulo. Simplemente cambie el tipo de referencia a MyClass para que la solución de sobrecarga pueda encontrar el método correcto. aygunes proporciona un buen ejemplo donde podría ser de utilidad –

32

Digamos que usted tiene estas dos funciones, y asume que aceptan null como válida valor para los segundos parámetros.

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

Estos dos métodos sólo se diferencian por el tipo de sus segundos parámetros. Si desea utilizar uno de ellos con un null como el segundo parámetro, debe convertir el null al tipo de segundo argumento de la función correspondiente, de modo que el compilador pueda decidir a qué función llamar.

Para llamar a la primera función: ShowMessage("Test", (Control) null);
Por segundo: ShowMessage("Test2", (MyDelegate) null);

Cuestiones relacionadas