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的哪一部分描述了自动创建空数组?
从JLS 15.12.4.2开始:
对于某些T,m的最终形式参数必然具有类型T [],并且必须使用k> = 0实际参数表达式调用m.
这是从被调用者的角度来看的.从调用者的角度来看,我不确定你引用的行为在哪里,但它有点暗示.
该 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[]{})。
换句话说,行为是在您正在查看的部分中指定的。
| 归档时间: |
|
| 查看次数: |
698 次 |
| 最近记录: |