我正在寻找Java语言规范(JLS)的相关部分,它描述了调用变量arity(vararg)方法时的行为。
考虑方法:
public static void printVarArgs(String... args) {
System.out.println(Arrays.toString(args));
}
如果我调用这样的方法:
printVarArgs();
输出结果如下:[]
,因为调用网站上遗漏的args
已在printVarArgs
方法中转换为空数组。
我正在寻找定义此行为的JLS的要点。我找到的最接近的是15.12.4.2 Evaluate Arguments,但它没有给出这个例子,我不确定这种情况是否实际上是由正式/数学描述所涵盖的。
JLS的哪一部分描述了省略vararg时自动创建空数组?
答案 0 :(得分:5)
来自JLS 15.12.4.2:
对于某些T,m的最终形式参数必然具有类型T [],并且必须使用k> = 0实际参数表达式调用m。
这是来自被调用者的观点。从调用者的角度来看,我不确定你引用的行为在哪里,但它有点隐含。
答案 1 :(得分:4)
该JLS部分的文字说:
如果被调用的方法是变量arity方法(§8.4.1)
m
,则它必须具有n > 0
形式参数。对于某些m
,T[]
的最终形式参数必须具有类型T
,并且必须使用k >= 0
实际参数表达式调用m。如果使用kn实际参数表达式调用m,或者,如果使用
k != n
实际参数表达式调用m并且第k个参数表达式的类型与T[]
不匹配,则对参数列表(e1, ... , en-1, en, ...ek)
进行评估,就好像它被写为(e1, ..., en-1, new T[]{en, ..., ek})
。
在您谈论的情况下,有k == n - 1
个正式参数,因此en, ..., ek
是一个空序列,这意味着该参数被评估为(e1, ..., en-1, new T[]{})
。< / p>
换句话说,行为在您正在查看的部分中指定。