2017-09-16 41 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); 
    } 
} 

在整型和字符串重載方法中,編譯器無法決定哪一個調用。爲什麼會發生這種情況?爲什麼編譯器在編譯Java代碼時感到困惑

如果我們刪除String或Integer重載方法中的任何一個,則在傳遞null時不會發生錯誤。

+1

您希望使用哪種超載?這*是不明確的。 – Carcigenicate

回答

-1

編譯器根據傳遞的參數的類型選擇最具體的方法。
在你的情況下,StringIntegerObject更具體,但兩者都是特定的,所以編譯器不會在中間選擇併發出編譯錯誤。

你可以參考15.12.2.5. Choosing the Most Specific Method

這可能是沒有一種方法是最具體的,因爲有 兩種以上的方法是最大限度具體。在這種情況下:

如果所有的最大具體方法有覆蓋等效 簽名(§8.4.2),則:

...

否則,該方法調用是不明確的,並且發生編譯時 錯誤。