2013-08-04 44 views
2

在java中,我正面臨函數模糊。基本上我重載一個可變參數函數
我確定我喜歡java中的函數模糊

 static void f(Integer... a) 
     { 
      // .. some statements 

     } 

     static void f(float f,Integer... a) 
     { 
      // .. some other statements 
     } 

函數可以調用函數與下面的函數調用

f(1,2); 
f(1.2f,1,2); 

此錯誤信息會彈出

error: reference to f is ambiguous, both method f(Integer...) in Test and method f(float,Integer...) in Test match 
     f(1,2); 
     ^

有人可以幫助我瞭解,如果我在這裏錯過了任何基本的java概念。 thnx ..

回答

3

這兩種方法都可以採用您輸入的第一個參數f(1,2);,這就是爲什麼您會模糊不清。 如果你會做

f((float)1,2); 

你不會得到例如

+0

但是如果我將第一個參數強制轉換爲float,f(float f,Integer ... a)版本將始終工作。我的意思是我似乎沒有找到一種方法來調用f(Integer ... a)版本。任何幫助? – Shashi

+0

我不是在暗示,但是你可以使用函數f(char,Integer ... a)來繞過這個問題。沒有其他辦法,因爲一個整數總是可以作爲一個浮點數,這意味着你將永遠不明確... –

+0

thnx指針。使用f(int b,Integer ... a)來解決歧義.. :) – Shashi

1

運行時可以選擇使用整數列表強制轉換函數來調用這兩個函數。這就是困惑所在。您提供的任何整數列表也可以轉換爲另一個帶有單個前導浮點數的整數,然後是整數列表。

3

在Java語言中的錯誤,詮釋值可以自動鑄造浮動值(是不允許的對面)。

因此,當您對

通話
f(1,2) 

Java編譯器匹配的所有可能的簽名是自動類型轉換允許,即:

  • F(INT,INT)
  • ˚F (float,int)
  • f(float,float)
  • f(int,float)
  • F(INT,...)
  • F(浮動,...)

有所在的該編譯器不知道你的意思是調用F(INT模糊,... )或f(浮動,浮動)。

+0

你能否建議我關於這個話題的更多信息? – Shashi

+0

用於選擇調用方法的方法簽名匹配在以下JLS部分中詳細介紹:http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2 – Lake

+0

您可能還想看看http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.3 – Lake

2

當幾種方法適用時,編譯器會嘗試查找最具體的方法。如果兩種方法是最具體的,那麼就存在一個不明確的地方,你會得到一個錯誤。

綜上所述(所述actual rules是有點複雜):

  • 編譯器確定爲f(1, 2),這兩種方法都適用(1可以是整數或浮點數)
  • 編譯器然後需要以確定which method is more specific:在您的情況下,沒有一個在規範中定義的含義上更具體,因爲floatInteger之間沒有關係(例如:如果您有f(int i, Integer... j)f(int i, Integer... j)對比f(float f, Integer... j),前者將更具體,因爲int比基元之間的float更具體。同樣,如果您有f(Number f, Integer... i)f(Integer... i),後者會更具體,因爲Integer延伸Number)。
+1

中的方法調用轉換部分請注意,使用'int ......「不會有含糊之處。這裏的關鍵要素是自動裝箱規則。 –