最近才发现,java里原来也可以实现可变参数。
SE5之前,我们如果想实现可变参数的效果,可以通过一个数组或Collection
public static void test(String [] args){
for (int i = 0; i < args.length; i++) {
System.out.println(args[i]);
}
}
如果是想不同类型的参数一起传,可以使用Collection,例如List等。
在SE5之后,java添加了这个新功能。也很简单。 只用三个点号(...)
public static void test(int ...objects){
//参数都是int类型的,所以可以用foreach
for (int object : objects) {
System.out.println(object);
}
}
public static void main(String [] args){
test();
test(1);
test(1,2,3,4,5);
}
参数类型可以是Object的。
另外,如同ruby中一样,可变参数可以与固定的参数相结合,不过需要注意的是,如果结合使用,那么可变参数必须卸载最后面。
public static void test(String str,Object ...objects){
System.out.println("str="+str);
for(Object obj : objects){
System.out.println(obj);
}
}
public static void main(String [] args){
test("abc");
test("abc",1,"abc",88.8f);
}
另外,一个方法中,只能定义一个可变参数!
知道了这个特性以后,以后可以在项目中使用了,应该会带来一些方便。
下面,让我们来看看具体使用的例子。
在Collections类的addAll方法中
/*
* ...
* @since 1.5
*/
public static <T> boolean addAll(Collection<? super T> c, T... elements) {
boolean result = false;
for (T element : elements)
result |= c.add(element);
return result;
}
采用了范型,所以可变参数的类型也可以使任意类型的。
来看个例子
public static void main(String [] args){
Collection col = new LinkedList();
boolean flag = Collections.addAll(col, 123,123.0f,888.0,"float",'c');
for(Iterator ite = col.iterator();ite.hasNext();){
Object obj = ite.next();
System.out.print(obj.getClass().getName());
System.out.println(" "+obj);
}
}
不加范型,参数可以是任意类型的
加上范型,参数类型即可指定
public static void main(String [] args){
Collection<String> col = new LinkedList<String>();
boolean flag = Collections.addAll(col,"int","float","string","123","char");
for(Iterator ite = col.iterator();ite.hasNext();){
Object obj = ite.next();
System.out.println(" "+obj);
}
}