何时以及为什么有人会这样做:
doSomething( (MyClass) null );
你有没有这样做过?你能分享一下你的经历吗?
答案 0 :(得分:128)
如果doSomething
超载,则需要将null显式转换为MyClass
,以便选择正确的重载:
public void doSomething(MyClass c) {
// ...
}
public void doSomething(MyOtherClass c) {
// ...
}
当您调用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);
}
}
最后一行会产生以下警告:
Example.java:26:警告:非varargs 用不精确的方法调用varargs方法 最后一个参数的参数类型;
转向java.lang.String
进行varargs 致电java.lang.String[]
致电 非varargs打电话并压制这个 警告
答案 1 :(得分:34)
假设您有这两个函数,并假设它们接受null
作为第二个参数的有效值。
void ShowMessage(String msg, Control parent);
void ShowMessage(String msg, MyDelegate callBack);
这两种方法的区别仅在于它们的第二个参数的类型。如果要使用其中一个null
作为第二个参数,则必须将null
强制转换为相应函数的第二个参数的类型,以便编译器可以决定调用哪个函数。
要拨打第一个功能:ShowMessage("Test", (Control) null);
第二个:ShowMessage("Test2", (MyDelegate) null);