2013-04-30 49 views
2

下面的代碼中的Java編譯罰款:方法調用順序

public static void main(String[] args) { 
    int i =5; 
    call(i); 
} 


static void call(int i){ 
    System.out.println("int"); 
} 

static void call(long i){ 
    System.out.println("long"); 
} 

static void call(Integer i){ 
    System.out.println("Integer"); 
} 


static void call(Object i){ 
    System.out.println("Object"); 
} 

但是,下面的代碼提供編譯時錯誤:

public static void main(String[] args) { 
    int i =5; 
    call(i); 
} 


static void call(int... i){ 
    System.out.println("int..."); 
} 

static void call(long... i){ 
    System.out.println("long..."); 
} 

static void call(Integer... i){ 
    System.out.println("Integer..."); 
} 


static void call(Object... i){ 
    System.out.println("Object..."); 
} 

爲什麼有工作,而類似的調用機制不是由Java的維護VAR-ARGS?在第二個例子中,呼叫應該轉到方法static void call(int... i)

+0

找到詳細信息沒有'Integer'和'Object'版本嗎?如果是的話,那是因爲自動裝箱。 – NilsH 2013-04-30 05:38:34

+1

http://stackoverflow.com/questions/2521293/b​​ug-with-varargs-and-overloading – 2013-04-30 05:47:39

+0

可能重複,@ c.P.u1。不過,應該用最近的jdk 7版本來解決,所以我認爲這個特定的錯誤是由於自動裝箱。 – NilsH 2013-04-30 06:08:41

回答

0

當您聲明方法爲Static void call(int ... i)並且該方法需要int數組但是在調用此方法時,您只發送一個整數值。

Static void call(int... i) is Same as Static void call(int[] i) 
-1

變量參數在java中被視爲數組。所以不是傳遞一個int值,而是像數組一樣傳遞它。例如。

int[] i ={5}; 
call(i); 
+1

是的,他們被視爲數組,但你不必用數組來調用他們。 – NilsH 2013-04-30 06:00:01

+0

在當前的情況下,這是我認爲可以調用該方法的方式。否則,你可以做..呼叫(5,6,7)。所以我的解決方案是關於這個問題的,所以這個人可以理解如何調用這個...在不理解解決方案的意圖的情況下給出否定的投票並不總是對的 – 2013-04-30 06:03:19

+1

是的,但它不回答問題,這就是爲什麼它給出了一個錯誤。 – NilsH 2013-04-30 06:04:10

1

這裏是answer

的Java亙古不變的工作以及與超載可變參數的方法。

這是什麼規格提供:

因此,什麼時候應該使用可變參數?作爲客戶,只要API提供它們,您就應該利用它們。核心API的重要用途包括反射,消息格式化和新的printf工具。作爲一名API設計人員,只有在真正引人注目的好處時,才應該謹慎使用它們。 一般而言,您不應該重載可變參數方法,否則程序員很難找出哪個重載被調用。

+0

您可以重載可變參數方法。但在某些情況下,您可能遇到像OP一樣的邊緣案例。 – NilsH 2013-04-30 06:09:43

+1

下面是對實際發生情況的解釋:http://www.xyzws.com/Javafaq/why-overloading-a-varargs-method-doesnt-work-for-the-primitive-type-and-its-object-包裝類型/ 50 – NilsH 2013-04-30 06:28:26

+0

該措辭來自* [功能指南],(http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html),*不是Java語言規範。 – EJP 2013-05-01 11:45:29