いつ、なぜ誰かが次のことをするでしょうか。
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);
}
}
最後の行では、次の警告が生成されます。
Example.java:26: 警告: 最後のパラメーターの引数の型が不正確な varargs メソッドの非 varargs 呼び出し。varargs 呼び出しのキャスト to
非varargs 呼び出しのキャスト およびこの警告を抑制するjava.lang.String
java.lang.String[]
これら 2 つの関数がありnull
、2 番目のパラメーターの有効な値として受け入れるとします。
void ShowMessage(String msg, Control parent);
void ShowMessage(String msg, MyDelegate callBack);
これら 2 つのメソッドは、2 番目のパラメーターの型のみが異なります。2 番目のパラメーターとしてa を使用してそれらのいずれかを使用する場合は、対応する関数の 2 番目の引数の型にnull
キャストする必要がありますnull
。これにより、コンパイラーはどの関数を呼び出すかを決定できます。
最初の関数を呼び出すには: ShowMessage("Test", (Control) null);
2 番目の関数の場合:ShowMessage("Test2", (MyDelegate) null);