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