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

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

Java
   public     class   Test   {      // Overloaded methods      public     void     fun  (  Integer     i  )      {      System  .  out  .  println  (  &  quot  ;  fun  (  Integer     )     &  quot  ;);      }      public     void     fun  (  String     name  )      {      System  .  out  .  println  (  &  quot  ;  fun  (  String     )     &  quot  ;);      }      // 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  (  &  quot  ;  fun  (  Integer     )     &  quot  ;);      }      public     void     fun  (  String     name  )      {      System  .  out  .  println  (  &  quot  ;  fun  (  String     )     &  quot  ;);      }      // 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) を選択し、その中のコードを実行するため、コンパイル時エラーは発生しません。注: オーバーライドされたメソッドの引数がプリミティブ データ型である場合、この問題は発生しません。コンパイラが最適なメソッドを選択して実行するためです。