6

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

4

2 回答 2

5

从 JLS 15.12.4.2 开始:

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

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

于 2012-06-05T22:38:08.983 回答
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[]{}).

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

于 2012-06-05T22:55:57.670 回答