是的,a T...
只是a的语法糖T[]
。
列表中的最后一个形式参数是特殊的;它可以是可变arity参数,由类型后面的省略号表示。
如果最后一个形式参数是类型的可变arity参数T
,则考虑定义类型的形式参数T[]
。该方法则是可变Arity方法。否则,这是固定的固定方法。可变arity方法的调用可能包含比形式参数更多的实际参数表达式。将评估所有与变量arity参数之前的形式参数不符的实际参数表达式,并将结果存储到数组中,该数组将传递给方法调用。
这是一个例子说明:
public static String ezFormat(Object... args) {
String format = new String(new char[args.length])
.replace("\0", "[ %s ]");
return String.format(format, args);
}
public static void main(String... args) {
System.out.println(ezFormat("A", "B", "C"));
// prints "[ A ][ B ][ C ]"
}
是的,上述main
方法是有效的,因为再次String...
是just String[]
。另外,由于数组是协变String[]
的Object[]
,所以a 是一个,因此您也可以ezFormat(args)
使用任何一种方式进行调用。
也可以看看
Varargs陷阱#1:传递 null
可变参数的解析非常复杂,有时它会使您感到惊讶。
考虑以下示例:
static void count(Object... objs) {
System.out.println(objs.length);
}
count(null, null, null); // prints "3"
count(null, null); // prints "2"
count(null); // throws java.lang.NullPointerException!!!
由于可变参数是如何解决的,最后一条语句调用与objs = null
,这当然会导致NullPointerException
用objs.length
。如果要将一个null
参数赋予varargs参数,则可以执行以下任一操作:
count(new Object[] { null }); // prints "1"
count((Object) null); // prints "1"
相关问题
以下是人们在处理varargs时提出的一些问题的样本:
Vararg陷阱#2:添加额外的参数
如您所知,以下内容不起作用:
String[] myArgs = { "A", "B", "C" };
System.out.println(ezFormat(myArgs, "Z"));
// prints "[ [Ljava.lang.String;@13c5982 ][ Z ]"
由于varargs的工作方式,ezFormat
实际上得到了2个参数,第一个是a String[]
,第二个是a String
。如果要将数组传递给varargs,并且希望将其元素识别为单独的参数,并且还需要添加额外的参数,那么您别无选择,只能创建一个容纳额外元素的数组。
以下是一些有用的辅助方法:
static <T> T[] append(T[] arr, T lastElement) {
final int N = arr.length;
arr = java.util.Arrays.copyOf(arr, N+1);
arr[N] = lastElement;
return arr;
}
static <T> T[] prepend(T[] arr, T firstElement) {
final int N = arr.length;
arr = java.util.Arrays.copyOf(arr, N+1);
System.arraycopy(arr, 0, arr, 1, N);
arr[0] = firstElement;
return arr;
}
现在,您可以执行以下操作:
String[] myArgs = { "A", "B", "C" };
System.out.println(ezFormat(append(myArgs, "Z")));
// prints "[ A ][ B ][ C ][ Z ]"
System.out.println(ezFormat(prepend(myArgs, "Z")));
// prints "[ Z ][ A ][ B ][ C ]"
Varargs陷阱#3:传递原始数组
它不起作用:
int[] myNumbers = { 1, 2, 3 };
System.out.println(ezFormat(myNumbers));
// prints "[ [I@13c5982 ]"
Varargs仅适用于引用类型。自动装箱不适用于原语数组。以下作品:
Integer[] myNumbers = { 1, 2, 3 };
System.out.println(ezFormat(myNumbers));
// prints "[ 1 ][ 2 ][ 3 ]"