class WrongOverloading{
void something(String [] a){ .. }
Integer something(String... aaa){ return 1;}
}
上面的代碼不能編譯!編譯器說這些是重複的方法。 因此使用String數組或String var-args的意思是一樣的嗎?String []和String ...(Var-args)在內部工作時是否相同?
它們是如何在內部實現的?
class WrongOverloading{
void something(String [] a){ .. }
Integer something(String... aaa){ return 1;}
}
上面的代碼不能編譯!編譯器說這些是重複的方法。 因此使用String數組或String var-args的意思是一樣的嗎?String []和String ...(Var-args)在內部工作時是否相同?
它們是如何在內部實現的?
他們實際上是相同的,只是編譯器將不接受可變參數,除非它的最後一個參數,它將不允許您將多個參數傳遞給數組。
public void methodA(int... ints, int a); // doesn't compile
public void methodA(int[] ints, int a); // compiles
public void methodB(int... ints); // compiles
public void methodC(int[] ints); // compiles
methodB(1); // compiles
methodB(1,2,3,4); // compiles
methodC(1); // doesn't compile
methodC(1,2,3,4); // doesn't compile
String... aaa
就像有String[] aaa
。
我假設第二個功能分號後是一個錯字...
[vararg]
屬性指定該方法採用可變數量的參數。要做到這一點,最後一個參數必須是VARIANT類型的安全數組包含所有剩餘的參數:
[vararg [, optional-attributes]] return-type function-name(
[optional-param-attributes] param-list,
SAFEARRAY(VARIANT) last-param-name);
的可變參數的語法基本上,您可以指定有可能的參數,對不對?他們可以在那裏,或不能在那裏。這是三個點的目的。當您調用該方法時,可以使用或不使用這些參數進行調用。這樣做是爲了避免將數組傳遞給方法。
看一看this:
見When do you use varargs in Java?
final public class Main
{
private void show(int []a)
{
for(int i=0;i<a.length;i++)
{
System.out.print(a[i]+"\t");
}
}
private void show(Object...a)
{
for(int i=0;i<a.length;i++)
{
System.out.print(a[i]+"\t");
}
System.out.println("\nvarargs called");
}
public static void main(String... args)
{
int[]temp=new int[]{1,2,3,4};
Main main=new Main();
main.show(temp);
main.show(); //<-- This is possible.
}
}
這是因爲這個原因,varargs
基本上沒有方法重載建議。
System.out.printf();
是varargs
一個例子,定義如下。
public PrintStream printf(String format, Object ... args)
{
return format(format, args);
}
格式 - 如在格式字符串的語法
ARGS描述的格式字符串 - 通過在格式字符串的格式說明符引用參數。如果有比格式說明符多的參數,則會忽略額外的參數。參數的數量是可變的,可能爲零。參數的最大數量受Java虛擬機規範定義的Java數組的最大維數限制。 null參數上的行爲取決於轉換。
是的,它們是相同的,因爲當你使用elipsis(String ...)調用方法時,它將轉換爲String數組。
基礎類型一個可變參數的方法
function(Object... args)
的是function(Object[] args)
。 Sun以這種方式添加了可變參數,以保持向後兼容性 。
因此,正如其他答案所說,是的,它們是一樣的。
幕後的編譯器實際上會將您的var args方法轉換爲具有數組輸入的方法。 這就是爲什麼你可以用一個數組作爲輸入重載var args方法的原因,因爲在編譯之後它們都是相同的。
是的,兩者是相同的...... http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html剛纔看了這個網站上,你會知道
同時呼籲它不關於返回類型護理的方法將考慮的方法名稱,參數和參數的類型和參數的順序號。在這裏您指定同名同參數的方法.bcoz在var arg的情況下,如果我們調用2個參數的方法,將執行相同的方法,如果我們調用3個參數的方法,它將調用相同的方法。如果我們調用某些東西(String [] a)和某些東西(String ... aaa),則會調用同樣的方法.bcoz,我們可以用var-arg替換數組,然後會出現一個混淆,該方法應該被調用。那麼方法歧義將會出現。這就是爲什麼它顯示重複的方法。
這裏如果我們將數組傳遞給var-arg參數方法,它將被執行。它在內部將var-args轉換爲單維數組。
不確定這是否符合答案或者是否描述了您剛剛遇到的問題。 – yvesmancera 2015-09-15 16:47:02
謝謝yvesmancera – krishna 2015-09-16 11:41:29
我已編輯答案 – krishna 2015-09-16 12:54:40
爲什麼你在函數的末尾使用分號? – Ankit 2012-01-06 07:06:28