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

Gru*_*eck 5 java variadic-functions jls

我正在寻找Java语言规范(JLS)的相关部分,它描述了调用变量arity(vararg)方法时的行为.

考虑方法:

public static void printVarArgs(String... args) {
    System.out.println(Arrays.toString(args));
}
Run Code Online (Sandbox Code Playgroud)

如果我像这样调用方法:

printVarArgs();
Run Code Online (Sandbox Code Playgroud)

输出将如下所示:[]因为args在调用站点中的省略已在方法中转换为空数组printVarArgs.

我正在寻找定义此行为的JLS的观点.我找到的最接近的是15.12.4.2评估参数,但它没有给出这个例子,我不确定这种情况是否实际涵盖在正式/数学描述中.

当省略vararg时,JLS的哪一部分描述了自动创建空数组?

Jas*_*n S 5

从JLS 15.12.4.2开始:

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

这是从被调用者的角度来看的.从调用者的角度来看,我不确定你引用的行为在哪里,但它有点暗示.


Ste*_*n C 5

该 JLS 部分的文字说:

如果被调用的方法是一个可变参数方法(第 8.4.1 节)m,则它必须具有n > 0形式参数。的最后一个形参m必定具有T[]some 的类型T,并且 m 必定用k >= 0实参表达式调用。

如果 m 用 kn 个实参表达式调用,或者,如果 m 用k != n实参表达式调用并且第 k 个参数表达式的类型与赋值不兼容T[],则参数列表(e1, ... , en-1, en, ...ek)被评估,就好像它写为 一样(e1, ..., en-1, new T[]{en, ..., ek})

在您所讨论的情况下,存在k == n - 1形式参数,因此en, ..., ek是空序列,这意味着参数被评估为(e1, ..., en-1, new T[]{})

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