logo

Java でのメソッドのオーバーロードと null エラー

Java では、メソッドをオーバーロードすることが非常に一般的です。以下は興味深い Java プログラムです。 

キャッチキャッチJavaを試してください
Java
public class Test {  // Overloaded methods  public void fun(Integer i)  {  System.out.println("fun(Integer ) ");  }  public void fun(String name)  {  System.out.println("fun(String ) ");  }  // Driver code   public static void main(String [] args)  {  Test mv = new Test();  // This line causes error  mv.fun(null);  } } 

出力:



22: error: reference to fun is ambiguous mv.fun(null); ^ both method fun(Integer) in Test and method fun(String) in Test match 1 error

上記のシナリオでコンパイル時エラーが発生する理由は、メソッド引数 Integer と String が両方とも Java のプリミティブ データ型ではないためです。つまり、null 値を受け入れることができます。 null 値をメソッド 1 に渡すと、両方のメソッドが null を受け入れるため、コンパイラはどちらのメソッドを選択する必要があるか混乱します。このコンパイル時エラーは、意図的に null 値を渡さない限り発生しません。たとえば、コーディング中に一般的に従う以下のシナリオを参照してください。 

Java
public class Test {  // Overloaded methods  public void fun(Integer i)  {  System.out.println("fun(Integer ) ");  }  public void fun(String name)  {  System.out.println("fun(String ) ");  }  // Driver code  public static void main(String [] args)  {  Test mv = new Test();    Integer arg = null;  // No compiler error  mv.fun(arg);  } } 

出力:

fun(Integer ) 

上記のシナリオでは、式の結果により 'arg' 値が null の場合、null 値がメソッド 1 に渡されます。ここでは、引数が Integer 型であることを指定しているため、コンパイラはメソッド 1(Integer i) を選択し、その中のコードを実行するため、コンパイル時エラーは発生しません。注: オーバーライドされたメソッドの引数がプリミティブ データ型である場合、この問題は発生しません。コンパイラが最適なメソッドを選択して実行するためです。