1

したがって、Javaの関数にnullを渡すことができます。Javaで関数をオーバーロードすることもできます。しかし、次のことを考慮してください

public static void main(String ... args){
    doStuff(null);
}

public static void doStuff(String s){
      solveWorldHunger();
}

public static void doStuff(Integer i){
      nukeCanada();
}

public static void nukeCanada(){
 System.out.println("NO!");
}

public static void solveWorldHunger(){
  System.out.println("YAY!");
}

以前のプログラムは、ソースコードの順序に関係なく、常にYAYを出力します...

誰かが、jvmがsolveWorldHunger関数を関数に対して実行することを一貫して決定する理由に光を当てることができnukeCanadaますか?

4

2 に答える 2

12

に格納できないことはコンパイラにとって非常に明白nullですprimitive int。それで、それは引数として持っているメソッドで行くことにしStringます。

ただし、2番目のメソッドをInteger引数として使用するように変更すると、コンパイラエラーが発生します。それらの両方がnull引数で呼び出される資格があるからです。したがって、あいまいさがあります。

したがって、2番目の方法を変更してみてください:-

public static void doStuff(String s){
      solveWorldHunger();
}

public static void doStuff(Integer i){  // Integer instead of `int`
      nukeCanada();
}

そして、でそれを呼び出しますnull。コンパイラエラーが表示されます。

したがって、その場合は、次のような型キャストを使用して適切なメソッドを呼び出すことができます。

doStuff((Integer)null);  // Calls Integer version
doStuff((String)null);   // Calls String version

また、のような2nd methodパラメータを取得する場合、コンパイラが最も具体的なパラメータ、つまり引数を選択するため、あいまいさはありません。super typeStringObjectString

したがって、あいまいさは、同じ継承階層にない型を持つ2つのメソッドがある場合にのみ発生します。

于 2012-11-29T21:40:05.277 に答える
1

doStuff(String) メソッドだけが NULL 引数を取ることができます...プリミティブ int は null になることはできません。オブジェクトを渡す 2 番目のメソッド オーバーロードがある場合、そのメソッドのパラメーターとして null を渡すことはできなくなります。

于 2012-11-29T21:41:14.740 に答える