reglas nulo martillo lanzamiento jabalina historia disco cuando bala java null

java - nulo - lanzamiento de jabalina reglas



¿Por qué un lanzamiento nulo? (2)

Vi esta pieza de código en alguna parte y me pregunté: cuándo y por qué alguien haría lo siguiente:

doSomething( (MyClass) null );

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


Si doSomething está sobrecargado, debe convertir el nulo explícitamente en MyClass para elegir la sobrecarga correcta:

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

Una situación no artificial donde necesitas lanzar es cuando llamas 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:

Ejemplo.java:26: advertencia: método de llamada varargs no varargs con tipo de argumento inexacto para el último parámetro;
enviar a java.lang.String para una llamada varargs
enviar a java.lang.String[] para una llamada no varargs y suprimir esta advertencia


Supongamos que tiene estas dos funciones y suponga que aceptan null como valor válido para los segundos parámetros.

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

Estos dos métodos difieren solo por el tipo de sus segundos parámetros. Si desea utilizar uno de ellos con un null como 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.

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