2014-09-30 68 views
1

我試過兩種情況如下:Java方法重載:異常行爲

void ssss(int b){ 
    System.out.println ("int"+b); 
} 
void ssss(double b){ 
    System.out.println ("long"+b); 
} 

,並提出了方法調用作爲

ssss(100); 

這工作得很好。

void calcAve(double marks1, int marks2) { 
    System.out.println ("first average"); 
} 
void calcAve(int marks1, double marks2) { 
    System.out.println ("second average"); 
} 

,並提出了方法調用作爲

calcAve(2,3); 

這返回一個編譯錯誤:參照calcAve是不明確的。

瞭解爲什麼第二個得到編譯錯誤。我的問題是使用相同的比喻,第一個案例也應該返回一個錯誤,但事實並非如此。爲什麼??

+2

的方法,因爲2可以是有效的int或雙 – 2014-09-30 05:53:15

+0

因爲你有2種重載方法,可以採取整數。 (double,int)以及(int,double)。像@getlost說的那樣,'2'可以被看作是一個'int'和一個'double'。 – TheLostMind 2014-09-30 05:53:37

+0

在第二種情況下,你的數據類型不匹配 – 2014-09-30 05:54:19

回答

1

,因爲你的參數匹配兩種方法 你應該告訴什麼是INT什麼是雙 2是有效的double以及INT

嘗試

calcAve((int)2,(double)3); 
4

直觀地說,在第一種情況是一種精確的類型匹配,而在第二種情況下,有兩個不相同的匹配同樣好(兩個int都可以提升爲double)。

準確的規則相當複雜,但您可以在JLS中找到它們:§15.12.2. Compile-Time Step 2: Determine Method Signature。解決歧義

一種方式是通過改變的參數的類型:

calcAve(2.0, 3); 
calcAve(2, 3.0); 
0

在Java中,如果你傳遞一個整型值作爲參數,你可以簡單地傳遞它,編譯器在編譯整數值爲32位整型值。如果你想傳遞一個Long值作爲一個參數,你必須在200L這個值的末尾添加「L」。然後編譯器將其編譯爲64位長的值。

正常情況下,浮點值是作爲雙精度值編譯的。如果你想傳遞一個double值作爲參數,你可以簡單地將它傳遞爲200.然後編譯器編譯爲64位double值。如果你想傳遞一個浮點值作爲一個參數,那麼你必須在200F這個值的末尾添加「F」。然後編譯器將其編譯爲浮點值(32位)

在你的情況下,兩個參數列表都與參數列表兼容。這就是爲什麼編譯器無法識別確切的一個。

如果傳遞雙值作爲2.0,那麼您可以執行要執行