JAVA 的 可變長度的 方法的 參數 好比 String...arg

參考地址:http://www.cnblogs.com/lanxuezaipiao/p/3190673.htmlhtml

http://zhidao.baidu.com/link?url=3l_o0uq0Fhhe4r_zkv3IisvAepzvHbLULt_6NIP7mhlKGUlqrtJs-OF0nD07uBOhTgTBqJidW_-yZkCmXA6aAKjava

 

main方法的簽名其實能夠這樣寫:
public static void main(String... args)//方法1
它也能夠運行.

而且,若是同時還存在
public static void main(String[] args)//方法2
會報已經存在重複的方法的錯誤.
因而可知,String... args跟String[] args對於虛擬機來講實際上是一回事.
並且,在方法內,經過...傳進來的參數的使用方法也跟一個數組徹底無二,能夠for循環,甚至能夠直接轉換:
public static void main(String... args)
{
    String[] ss=args;
}

但對於程序員來講卻仍是有差異的.
1.調用
咱們只能這樣調用方法2:
main(new String[]{});
即,方法2只能接受String數組作參數.
而咱們陌生的方法1可強了,用如下參數調用,照單全收:
main();
main(null);
main(null,null);
main(null,null,null);
......
main("a");
main("a","b");
main("a","b","c");
......
main(new String[]{});

(String...匹配String*,而null也能夠是一個特殊的String)

2.參數位置
使用...的參數只能是最後一個參數.否則誰知道你調用的時候,點點點匹配到哪一個實參?
public static void main(String[] args,int index)//能夠
public static void main(String... args,int index)//不行!

3.重載
假設有如下兩個方法:
public static void main(String... args)//方法1
public static void main(String a,String... args)//方法3
從語法上來看,這個重載徹底沒有錯誤,eclipse也沒有報錯.可是當調用時使用的參數個數大於這些方法中點點點參數前面的參數個數時,eclipse就會發現這個錯誤了.很拗口是否是?嘿嘿~仍是舉例來講吧.以上這兩個方法,若是調用時
main();
編譯器會認出這個調用的是方法1.可是若是調用時
main("");
編譯器就瘋了...由於一個String參數,既符合方法1的點點點,也符合方法3的String+點點點,編譯器就不知道調用的是哪一個方法了.
String[]參數不會有這種問題.
因此重載時要注意,若是點點點參數前面有跟它類型相同的參數...最好的方法,彷佛就是換回數組形式了,要麼就給方法改個名字吧.

4.趕上泛型加外包
用個實例來講
java.util.Arrays是個工具類,全部方法都是靜態的,對數組的操做.裏面有個方法asList(T... args),用來把類型T的數組轉化成List<T>.
這是個頗有用的方法,在絕大多數狀況下都能如你所願.
可是,你能夠試試下面的寫法
int[] is=...//自定義的數組,或者從什麼地方獲取來的數組
List<Integer> list=Arrays.asList(is);
很不幸,不要說執行,編譯都通不過.錯誤的意思大概是:
不能將List<int[]>轉化成List<Integer>
明白了吧?
你的設想是,把int[]中的每個元素對應T...中的每個點,
可編譯器不這麼想.由於int是原始類型,不是Object的子類.而泛型T隱含的條件是T extends Object.因此編譯器不會把每個int看作T,不會把int[]看作T點點點.雖然java已經支持自動將原始類型封包成外包類,但那是單個的狀況.
而數組(無論什麼類型)則是一種特殊的類型,是Object的子類,因此編譯器以爲整個int[]對應一個T,你調用的方法是asList<int[]>(int[]... args)而不是你想象中的asList<Integer>(Integer...)
相關文章
相關標籤/搜索