为什么空转换参数?

2022-08-31 12:21:57

何时以及为什么有人会执行以下操作:

doSomething( (MyClass) null );

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


答案 1

如果 是重载的,则需要显式地将 null 转换为,以便选择正确的重载:doSomethingMyClass

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:警告:对 varargs 方法的非 varargs 调用,最后一个参数的参数类型不准确;
对于非 varargs 调用
,请强制转换为 to,并禁止显示此警告java.lang.Stringjava.lang.String[]


答案 2

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

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

这两种方法仅在于其第二个参数的类型。如果要将其中一个参数与 a 一起使用作为第二个参数,则必须将 to 转换为相应函数的第二个参数的类型,以便编译器可以决定调用哪个函数。nullnull

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