2

以下のコードが機能しない理由を知りたいです:

System.out.print(null);    
response.getWriter().print(null);

しかし、以下のものは機能します:

String s = null;
System.out.print(s);
response.getWriter().print(s);

nullとして参照を渡すことと比較して、を渡すことの違いはnull何ですか?

編集済み: 前述のように機能しないことは、コンパイルエラーを示します。

4

3 に答える 3

9

Objectこれは、またはを渡すことができるためですString。両方に適合できるためnull、コンパイラはどちらの方法を使用するかわからず、コンパイルエラーが発生します。

メソッドの定義:

代わりに、ObjectまたはString変数を指定すると(null値がある場合でも)、コンパイラーは使用するメソッドを認識します。

編集:これはこの回答でよりよく説明されています。Java仕様を指す内部リンクについては、ここで読むことができます。この場合は、次のようになります。

非公式の直感では、コンパイル時の型エラーなしに最初のメソッドによって処理された呼び出しを別のメソッドに渡すことができれば、あるメソッドは別のメソッドよりも具体的です。

最大限に具体的な方法が2つ以上あるため、最も具体的な方法がない可能性があります。

于 2013-02-09T03:43:06.880 に答える
3

それSystem.out.println()は、型のあるものを期待しているからです。nullタイプがないため、単独で出力することはできません。これは次のように示されます。

動作しません:

 System.out.println(null);

作品:

 System.out.println((String)null);
 System.out.println((char[])null);
 System.out.println((Object)null);

メソッド呼び出しのパラメーターを型チェックするコンパイラです。

于 2013-02-09T03:59:56.787 に答える
2

回答ありがとうございました。あなたの入力から、私は自分で答えをまとめました。ここでは、 と の 2 つの最適な特定の一致が検出されるため、呼び出しSystem.out.print(null)がコンパイラにとってあいまいであるように思われます。そのため、コンパイラはここでどのメソッドを呼び出すかを判断できません。 小さな例は次のとおりです。print(null)print(String)print(char[])

private void methodCall(String str) {
}

private void methodCall(char[] ch){
}

ここで、このコードはあいまいになります: methodCall(null).

于 2013-02-09T07:46:28.850 に答える