web-dev-qa-db-ja.com

nullがパラメーターをキャストする理由

いつ、なぜ誰かは次のことをしますか?

doSomething( (MyClass) null );

これをしたことがありますか?あなたの経験を共有していただけませんか?

81
pek

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:警告:最後のパラメーターの引数型が不正確なvarargsメソッドの非varargs呼び出し。
varargs呼び出しのためにJava.lang.Stringにキャストします
varargs以外の呼び出しでJava.lang.String[]にキャストし、この警告を抑制します

128

これらの2つの関数があり、2番目のパラメーターの有効な値としてnullを受け入れると仮定します。

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

これらの2つのメソッドは、2番目のパラメーターのタイプのみが異なります。そのうちの1つをnullを2番目のパラメーターとして使用する場合は、nullを対応する関数の2番目の引数の型にキャストして、コンパイラーがどの関数にコール。

最初の関数を呼び出すには:ShowMessage("Test", (Control) null);
2番目の場合:ShowMessage("Test2", (MyDelegate) null);

34
Eren Aygunes