2017-09-16 4 views
-1
public class CompilerConfuse { 

    public static void main(String[] args) { 

     A a =new A(); 
     a.method(null); // error line 

    } 

} 


class A 
{ 

    public void method(Integer a) 
    { 
     System.out.println("In Integer argument method" + a); 
    } 

    public void method(Object a) 
    { 
     System.out.println("In Object argument method" + a); 
    } 

    public void method(String a) 
    { 
     System.out.println("In String argument method " + a); 
    } 
} 

IntegerとStringのオーバーロードメソッドでは、どちらの呼び出しを行うかをコンパイラが判断できませんでした。コンパイラがJavaコードのコンパイルで混乱する理由

String型またはInteger型のオーバーロードメソッドを削除すると、nullを渡すときにエラーが発生しません。

+1

どのようなオーバーロードを使用すると思いますか?これはあいまいです。 – Carcigenicate

答えて

-1

コンパイラは、渡された引数の型に従って最も具体的な方法を選択します。
StringIntegerObjectより具体的ですが、どちらも具体的であるため、コンパイラはコンパイルエラーを選択せず​​にコンパイルエラーを発行します。あなたが15.12.2.5. Choosing the Most Specific Methodを参照することができ

最大限に固有のものです 二つ以上の方法があるので、何の方法は、最も特定されないことがあります。

全て最大限に特定の方法がオーバーライド相当 シグネチャ(8.4.2)、その後持っている場合:この場合

を...

そうでない場合には、メソッド呼び出しがあいまいであり、そしてコンパイル時 エラーが発生します。