为什么null投射?

我在某处看到这段代码,并想知道:何时以及为什么有人会做以下事情:

doSomething( (MyClass) null ); 

你有没有做过这个? 你能分享一下你的经验吗?

如果doSomething重载,则需要将null明确地转换为MyClass以便select正确的重载:

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

您需要投射的非devise情况是当您调用可变参数函数时:

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

最后一行将产生以下警告:

Example.java:26:警告:对于最后一个参数,非可变参数types的可变参数方法的调用;
强制转换为java.lang.String作为可变参数调用
强制转换为java.lang.String[]以进行非可变参数调用,并禁止此警告

假设您有这两个函数,并假定它们接受null作为第二个参数的有效值。

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

这两种方法的区别仅在于其第二个参数的types。 如果你想用null作为第二个参数,你必须将null转换为相应函数的第二个参数的types,以便编译器可以决定调用哪个函数。

要调用第一个函数: ShowMessage("Test", (Control) null);
对于第二个: ShowMessage("Test2", (MyDelegate) null);