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...)
相关文章
相关标签/搜索