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 値を渡さない限り発生しません。たとえば、コーディング中に一般的に従う以下のシナリオを参照してください。
Javapublic 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) を選択し、その中のコードを実行するため、コンパイル時エラーは発生しません。注: オーバーライドされたメソッドの引数がプリミティブ データ型である場合、この問題は発生しません。コンパイラが最適なメソッドを選択して実行するためです。