Java语言规范的哪一部分描述了省略的varargs的行为?

时间:2012-06-05 22:32:46

标签: java variadic-functions jls

我正在寻找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时自动创建空数组?

2 个答案:

答案 0 :(得分:5)

来自JLS 15.12.4.2:

  

对于某些T,m的最终形式参数必然具有类型T [],并且必须使用k> = 0实际参数表达式调用m。

这是来自被调用者的观点。从调用者的角度来看,我不确定你引用的行为在哪里,但它有点隐含。

答案 1 :(得分:4)

该JLS部分的文字说:

  

如果被调用的方法是变量arity方法(§8.4.1)m,则它必须具有n > 0形式参数。对于某些mT[]的最终形式参数必须具有类型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>

换句话说,行为在您正在查看的部分中指定。