您的位置:首页 > 编程语言 > Java开发

可变参数列表-Java SE5新特性

2013-06-29 17:13 267 查看
1.可变参数列表的简单实现
当调用方法时,方法的参数个数或类型未知时,称其为可变参数列表。在以前的Java代码中,可以使用Object数组来实现这样的功能。因为,所有的类都是直接或间接继承于Object类。

VarArgs.java
package sample;

class A1{}

public class VarArgs {
static void printArray(Object[] args){
for(Object obj:args)
System.out.print(obj+" ");
System.out.println();
}

public static void main(String[] args){
printArray(new Object[]{
new Integer(47),new Float(3.14),new Double(11.11)
});
printArray(new Object[]{"one","two","three"});
printArray(new Object[]{new A1(),new A1(),new A1()});
}
}
结果:
[align=left]47 3.14 11.11[/align]
[align=left]one two three[/align]
sample.A1@a90653 sample.A1@de6ced sample.A1@c17164

这里printArray方法使用Object数组作为参数,并使用foreach语法遍历数组,打印每个对象。

2.Java SE5实现可变参数列表
同样的方法,参数可以这样定义,(Object…args),这样达到同样的效果。

NewVarArgs.java
package sample;

class A{}

public class NewVarArgs {
static void printArray(Object...args){
for(Object obj:args)
System.out.print(obj+" ");
System.out.println();
}

public static void main(String[] args){
printArray(new Integer(47),new Float(3.14),new Double(11.11));
printArray(47,
printArray("one","two","three");
printArray(new A(),new A(),new A());
printArray((Object[])new Integer[]{1,2,3,4});
printArray();
}
}

结果:
[align=left]47 3.14 11.11[/align]
[align=left]47 3.14 11.11[/align]
[align=left]one two three[/align]
[align=left]sample.A@a90653 sample.A@de6ced sample.A@c17164[/align]
1 2 3 4

这里没有显式的使用数组作为参数,但编译器实际上会为你填充数组。所以同样可以使用foreach语法来遍历之。
注意倒数第二行,编译器已经发现它是一个数组,所以不会在其上执行任何转换。最后一行表明,可以传递零个参数。
也可以指定所有可变参数的类型,下面的程序指定所有可变参数都必须是String。

OptionalArguments.java
package sample;

public class OptionalArguments {
static void f(String...trailing){
for(String s:trailing)
System.out.print(s+" ");
System.out.println();
}

public static void main(String[] args){
f("one");
f("two","three");
f();
}
}
结果:
[align=left]one[/align]
two three

可以在可变参数列表中同时使用原始类型与包装类。

AutoboxingVarargs.java
package sample;

public class AutoboxingVarargs {
public static void f(Integer...args){
for(Integer i:args)
System.out.print(i+" ");
System.out.println();
}

public static void main(String[] args){
f(new Integer(1),new Integer(2));
f(3,4,5,6,7,8,9);
f(10,new Integer(11),12);
}
}
结果:
[align=left]1 2[/align]
[align=left]3 4 5 6 7 8 9[/align]
10 11 12

3.可变参数列表的重载(Overloading)
如果出现重载的情况,则编译器会自动调用最适合的方法匹配之。

OverloadingVarargs.java
package sample;

public class OverloadingVarargs {
static void f(Character...args){
System.out.print("first ");
for(Character c:args)
System.out.print(c+" ");
System.out.println();
}

static void f(Integer...args){
System.out.print("second ");
for(Integer i:args)
System.out.print(i+" ");
System.out.println();
}

static void f(Long...args){
System.out.print("third ");
for(Long l:args)
System.out.print(l+" ");
System.out.println();
}

static void f(Double...args){
System.out.print("forth ");
for(Double d:args)
System.out.print(d+" ");
System.out.println();
}

public static void main(String[] args){
f('a','b','c');
f(1);
f(2,1);
f(0.1);
f(
}
}

结果:
[align=left]first a b c[/align]
[align=left]second 1[/align]
[align=left]second 2 1[/align]
[align=left]forth 0.1[/align]
third 0

但下面的情况是不允许的,即某个方法中增加一个非可变参数。

OverloadingVarargs2.java
package sample;

public class OverloadingVarargs2 {
static void f(float i,Character...args){
System.out.println("first");
}

static void f(Character...args){
System.out.println("second");
}

public static void main(String[] args){
f(1,'a');
f('a','b');//Error
}
}
但可以这样解决问题。
package sample;

public class OverloadingVarargs2 {
static void f(float i,Character...args){
System.out.println("first");
}

static void f(char c,Character...args){
System.out.println("second");
}

public static void main(String[] args){
f(1,'a');
f('a','b');
}
}
即重载的方法必须保持一致的参数形式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: