2015-03-31 43 views
2

我試圖理解方法重載,我無法理解在下面的例子爲下面的代碼錯誤的原因的方法是不明確的

public class OverLoading_OverRiding { 
    public static void main(String[] args) { 
     OverLoading_OverRiding o = new OverLoading_OverRiding(); 
     o.sum(5, 5); 
    } 

    void sum(int i, long j) { } 
    void sum(long i, int j) { } 
} 

我得到一個錯誤:

The method sum(int, long) is ambiguous for the type OverLoading_OverRiding.

當我在同樣的例子進行顯式類型轉換,然後它的工作原理:

o.sum(5, (long)5); 

回答

1

i can't able to proper understand ambiguous type error reason

編譯器說它不知道調用哪個方法。導致呼叫不明確。

4

的問題是,你的編譯器不知道如果你調用o.sum(5, 5);

  1. 在那裏他需要,只要前5 int和第二個5他可以利用void sum(int i, long j) { }使用哪種方法

  2. 他可以用void sum(long i, int j) { } 他取第5,只要和第二個5爲INT

因爲在這個例子中兩種方法都是有效的,並且你的編譯器總是需要正好一個有效選項,你會得到錯誤消息,說明你的方法不明確。

如果你調用o.sum(5, (long)5);它僅匹配方法void sum(int i, long j) { }


的問題是,爲什麼你會這樣重載方法? 大多超載用於可選參數是這樣的:

void myMethod(int i) {} 
void myMethod(int i, bool b) {} 
void myMethod(int i, string s) {} 

,所以你可以這樣調用方法:

myMethod(42); 
myMethod(42, true); 
myMethod(42, "myString"); 

也許這給你方法重載的想法。

+0

是的TobiasR我知道方法重載的想法,但我的問題是理解錯誤 – 2015-03-31 09:09:12

+0

@Dhruv Raval更新。也許現在更清楚了。 – 2015-03-31 09:26:00

1

由於5可以呈現既作爲long和作爲int編譯器不能沒有更多的信息推斷到的兩種方法來調用,因爲它們的方法簽名是針對同一呼叫兼容。

當您將第二個參數強制轉換爲long時,編譯器可以推斷出可以使用第二個簽名,因爲沒有其他選項。

另外:

o.sum((int)5, 5); // or long 

會出於同樣的原因

0

這是因爲5可能是隱含長或整數工作..由於這個原因,方法調用是不明確的。

0

簡單,你甲肝傳遞正確的參數在你的方法是在你的第一種情況下o.sum (5,5L)這裏第一個參數是INT 5和第二是5L長期 和你的第二個案例(5L, 5)。 這將正常工作

1

這裏的原因是,

案例1:金額(INT一個,長二);

這裏sum(5,5)匹配這個方法。

如何? 由於第一個參數是int &調用方法也是int。現在下一個參數很長,但我們傳遞的是int。所以呢?它滿足擴展轉換/隱式類型轉換。隱式類型鑄造

實施例:

int i=10; 
double j; 
j=i; 
System.out.println(j); // Output j=10.0 

同樣的事情發生在這裏, 總和(5,5)匹配=>總和(INT,長)&總和(長,INT)

情況2:總和(長,INT b)

總和(5.0,5)這兩種方法相匹配