在Java1.5中创建可变参数[Varargs] (5)
max = i;
}
return max;
}
}
那么关于调用同样的方法来处理通常参数不是数组的方法,又会如何呢?这当然是完全合法的。下面的代码都是合法调用max()方法的手段:
int max = MathUtils.max(myArray);
int max = MathUtils.max(new int[] { 2, 4, 6, 8 });
int max = MathUtils.max(2, 4, 6, 8);
int max = MathUtils.max(0);
int max = MathUtils.max( );
指定对象参数,而非基本类型
在第四章中我们谈到,Tiger通过拆箱增加了一系列的新特征。你可以在处理可变参数时,在你的方法接受的参数中使用对象包装类。
如何实现?
你一定记得在Java中所有的类最终都是java.lang.Object的子类。这就意味着任何对象可以被转化成一个Object对象。更进一步说,因为像int和short这样的基本类型会自动转化成他们对应的对象包装类(就像Integer和Short),任何Java类型可以被转化成一个Object对象。
所以,如果你需要你的可变参数方法可以接受最多种参数的类型,那么你可以将Object类型作为参数的类型。更好的是,为了达到多重功能,绝大多数情况下都会使用Object对象。例如,写个用来打印方法。
private String print(Object... values) {
StringBuilder sb = new StringBuilder( );
for (Object o : values) {
sb.append(o)
.append(" ");
}
return sb.toString( );
}
这儿最简单的意思是打印出所有的东西。然而,这个方法更通用的定义是下面的样子:
private String print(String... values) {
StringBuilder sb = new StringBuilder( );
for (Object o : values) {
sb.append(o)
.append(" ");
}
return sb.toString( );
}
这个方法的问题是方法自身不能接受字符串,整数,浮点数,数组和其他的类型数据,而这些数据你都想要正常的打印出来。通过使用Object这个更为通用的类型,你可以来打印所有的一切。
private String print(Object... values) {
StringBuilder sb = new StringBuilder( );
for (Object o : values) {
sb.append(o)
.append(" ");
}
return sb.toString( );
}
避免数组自动转化
Tiger增加了各种类型的自动转化和便利,这些东西在绝大多数的情况下是很好用的。不幸的是,有些时候所有的这些东西会变成你的障碍。其中一种情况是,在可变参数方法中将多个Object对象转化为Object[]数组对象,你会发现在个别的情况下,你需要用Java来书写。
如何实现?
在将要仔细讨论这件事情前,你要确信自己理解这个问题。Java新的printf()方法是一个很好的便利,举这个方法作个例子:
System.out.printf("The balance of %s’s account is $%(,6.2f\n",account.getOwner()。getFullName( ),account.getBalance( ));
如果你看一下Java文档中关于printf()方法的说明,你就会看到它是一个可变参数的方法。它有两个参数:一个是用于设置字符串格式的String类型变量,另一个是所有要传递进字符串的Object对象:
PrintStream printf(String format, Object…… args)
现在,你可以把上面的代码默认为下面的形式:
PrintStream printf(String format, Object[] args)
两种书写是不是完全相同呢?大多数情况下是相同的。考虑一下下面的代码:
Object[] objectArray = getObjectArrayFromSomewhereElse( );out.printf("Description of object arr


您的位置:
