Java 为什么null强制转换参数?
何时以及为什么会有人做以下事情:Java 为什么null强制转换参数?,java,null,Java,Null,何时以及为什么会有人做以下事情: doSomething( (MyClass) null ); 你曾经这样做过吗?您可以分享您的经验吗?如果doSomething重载,您需要将null显式转换为MyClass,以便选择正确的重载: public void doSomething(MyClass c) { // ... } public void doSomething(MyOtherClass c) { // ... } 调用varargs函数时,需要强制转换的非人为情况是
doSomething( (MyClass) null );
你曾经这样做过吗?您可以分享您的经验吗?如果
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);
}
}
最后一行将产生以下警告:
java:26:warning:non-varargs
varargs方法的不精确调用
最后一个参数的参数类型对于varargs,强制转换为
java.lang.String
调用转换为
java.lang.String[]
以获取
非varargs调用并禁止此操作
警告
假设您有这两个函数,并假设它们接受
null
作为第二个参数的有效值
void ShowMessage(字符串消息,控件父项)代码>
void ShowMessage(字符串消息,MyDelegate回调)代码>
这两种方法的区别仅在于其第二个参数的类型。如果要将其中一个参数与null
一起用作第二个参数,则必须将null
强制转换为相应函数的第二个参数类型,以便编译器可以决定调用哪个函数
调用第一个函数:ShowMessage(“Test”,(Control)null)代码>
对于第二个:ShowMessage(“Test2”,(MyDelegate)null)代码>也许只是一个没有经验的程序员?或者有人把代码从doSomething((cast)something)改为doSomething((cast)something);想把它改成null,只是不想删除演员阵容?它是在多个地方还是仅仅在一个实例中?我不记得在哪里读过它,但我看到了这一点,并了解到可以将null强制转换为对象。问题是,我找不到合理的方案!:p这不是空类型转换。没有这样的事。这是一个空的类型转换。完全相反。你原来的标题更好。NullPointerException呢?我确实找到了这个答案,但我没有想到现实世界会出现这样的情况!你这样做了吗?为什么?通常在单元测试中,您可能会将null传递给与NullPointerException无关的函数。您不能取消对空值的引用。您只需更改对MyClass的引用的类型,以便重载结果可以找到正确的方法。aygunes提供了一个很好的例子,可以使用它