java5特性(可变参数列表)
2011-11-14 09:41
197 查看
转载:http://www.blogjava.net/Carter0618/archive/2007/08/19/137889.html
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'); } } |
相关文章推荐
- java5新特性之方法的可变参数
- Java可变参数关于参数列表含可变参数的方法重载的注意点
- 【C/C++】sprintf中如何将容器作为可变参数列表传入
- Pointers on C 第7章 函数——可变参数列表
- 可变参数列表求一组数的最大值
- 集合框架__JDK1.5新特性__【增强for循环】【可变参数】【静态导入】
- 函数的可变参数列表
- 黑马程序员——静态导入,可变参数,自动拆箱装箱以及享元设计模式 JDK1.5新特性
- C中的可变参数列表用法总结
- 可变参数 函数(可变参数列表--1)
- 【c语言】实现可变参数列表
- C语言可变参数列表详解
- Effective JavaScript Item 22 使用arguments来创建接受可变参数列表的函数
- C语言定义可变参数列表的函数
- 可变参数列表与自动转型
- JDK5新特性之可变参数
- 可变参数列表
- Object..values可变参数列表,可理解为object[]数组类型
- 可变参数列表-Java SE5新特性
- C语言中的可变参数列表使用详解(转)