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提供了一个很好的例子,可以使用它