2014-04-10 30 views
6
public class aman { 
    void m(double a , int b, int c) { 
     System.out.println("second"); 
    } 
    void m(float a , int b, double c) { 
     System.out.println("first"); 
    } 
    public static void main(String[] args) { 
     aman obj = new aman(); 
     obj.m(23, 12, 1); 
    } 
} 

在此,方法M()已被重載,但我不理解爲什麼呼叫是ambigous因爲在第一種方法中只有1次轉換需要而在第二種方法中,需要兩個轉換髮生。所以,絕對應該先調用第一種方法。請說明爲什麼沒有發生這種情況,或者我缺少一些規則。使用類型提升重載時,爲什麼方法調用不明確?

回答

11

JLS不會將2次轉換和1次轉換視爲差異。它只會區分必須轉換不必轉換

由於兩種方法必須轉換爲,它們同樣可能。

與此主題相關的還有my answer on a similar question(但不完全相同)。

+0

thnks爲您的答案,我已經通過它,並訪問http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5但在這裏我不能理解一行**如果第一個方法處理的任何調用可以傳遞給另一個方法而沒有編譯時類型錯誤,則一種方法比另一種方法更具體。**您能否解釋它 – Aman

+0

當然。這句話基本上意味着,如果對第一種方法的任何調用也可以通過後一種方法解決,則可以認爲方法比另一種方法更具體。這意味着例如一個方法'm(Object)'可以解析所有對'm(User)'的調用(因爲'User'是一個'Object')。因此,我們可以說'm(User)'方法比另一個更具體,因爲對'm(Object)'(如'm(Integer)')的調用不能被'm(User)'解析,因爲那裏'Integer'和'User'之間沒有關係。 –

+0

所以在我的情況下沒有方法更具體,是編譯時錯誤的原因? – Aman

-2

由於您用三個Integer文字來稱呼它,所以它很模糊。

您可以選擇使用:

obj.m(23d, 12, 1); 

obj.m(23, 12, 1f); 

襯托出至極的說法是想因爲是和至極arguement可以鑄造。

+0

是的我知道,所以你想說什麼。請詳細解釋 – Aman

+0

@ user3519914我編輯了我的答案,這可能有所幫助。否則,請參閱[Jeroen Vannevel](http://stackoverflow.com/users/1864167/jeroen-vannevel)的答案。 – ifloop

3

這裏,方法將不明確,因爲您將所有參數填充爲整數值,則編譯器會混淆(對於自動類型轉換)。因此你需要爲你的代碼定義如下這樣的後綴:

public class aman { 
    void m(double a , int b, int c) { 
     System.out.println("second"); 
    } 
    void m(float a , int b, double c) { 
     System.out.println("first"); 
    } 
    public static void main(String[] args) { 
     aman obj = new aman(); 

     obj.m(20d, 30, 40);//for calling first method 
     obj.m(23f, 12, 1d);//for calling second method. 
    } 
} 
0

這裏兩個提升都是可能的,int可以浮動到double。所以編譯器無法決定哪個方法被調用,因此在運行時會產生模糊的錯誤。在重寫類型自動提升的方法中使用循環孔。

-1
public class Test { 

    void m(int c , int b, int d) { 
     System.out.println("Automatic promotion in overloading--->"+c); 

    } 

    public static void main(String[] args) { 
     Test obj = new Test(); 
      obj.m('A', 30, 40); 
    } 
} 
+0

這是如何回答這個問題? – Pang

相關問題