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 ajava.lang.String
para una llamada varargs
enviar ajava.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);