本文共 1345 字,大约阅读时间需要 4 分钟。
6.9 接收可变数目参数的方法
可以编写一个方法,让它在被调用时接收数目可变的参数,而传给它的参数不需要是相同类型。这样的方法称为Varargs方法。等到现在才提到这一点的原因是,要理解Varargs方法的工作原理,就必须理解Object类担负的角色。可以通过按如下方式设定最后一个参数来指出方法能够接受可变数目的参数:
Object ... args
在这个参数之前,方法可以有零个或多个参数,但很明显这必须是最后一个参数。Object类型名与args参数名之间的省略号允许编译器决定这个参数列表是可变的。参数名args代表Object[]类型的数组,而参数值是数组中作为Object类型可用的元素。在方法体中,args数组的长度指明所提供参数的数目。
下面考虑一个非常简单的例子来展示上述机制。假设想要实现一个静态方法,它接受任意数目的参数并且将参数输出到命令行中——不管它们的内容如何。可以按如下方式编写代码:
这些参数可以是任何内容。基本类型的值都被自动装箱,因为方法期望获得引用参数。其中的循环在单行中输出每个参数的字符串表示,产生的字符串通过调用每个参数的toString()方法获得。下面看一下效果。
试一试 展示任意类型的参数
这是一个用来练习printAll()方法的程序:
程序将产生如下输出:
2 two 4 four 4.5 four point five
25 Anything goes true 40000.0 false
示例说明
可以从输出中看出,printAll()方法的确按照介绍的方式工作并且接受任意数目的参数。printlAll()方法的第一次调用混合了int、String以及double类型的参数。每个数字值都通过编译器插入的装箱转换被转换成对应封装类类型的对象。之后调用这些对象的toString()方法产生输出字符串,这也是由编译器产生的。对printAll()方法的第二次调用则生成一个空行。最后一行输出显示自动装箱能对boolean值以及其他基本类型值起作用。
标准类库使用可变参数列表功能来定义java.io.PrintStream类中的printf()方法,该方法对任意不同类型的值序列生成格式化的输出,其中的输出格式通过第一个参数设置。System.out恰好是PrintStream类型,所以能使用printf()生成到命令行的格式化输出。在第8章中讲解流时会讨论如何使用printf()方法以更加精确地控制输出的格式。
限制可变参数列表中的类型
不用将可变参数列表的类型设置为Object,可以将之设置为任意类类型或接口类型。其中的参数必须是您指定的类型,或是您指定类型的子类型。将可变参数列表的类型指定为Object会让灵活性最大,因为可以提供任意类型的参数,但是也有些情况,可能想要限制所能提供的参数类型。例如,如果想要定义一个方法来计算以独立参数方式提供的任意数字值的平均数,那么肯定想确保这些参数只能是数字值。代码如下:
在这种情况下,这些参数必须是Double类型或是从Double派生的类型或double类型(因为编译器可以提供自动装箱转换)。
【责任编辑:book TEL:(010)68476606】
点赞 0
转载地址:http://dxifo.baihongyu.com/