java可变参数

在动态语言,如ruby中,可以实现可变参数

def test(* arg)
for s in arg
puts s,s.class
end
end

test(1,"2",2.3)

只需在参数前加一个*即可。
调用方法时,可以传入任意数量,任意类型的参数了。
一直以为可变参数是动态语言的特性呢。
最近才发现,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);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值