为什么 varargs 应该是方法签名中的最后一个?

如果我试图写一个如下的方法

public void someStuff(Object ... args, String a )

我收到此错误

方法 someStuff 的变量参数类型 Object 必须是最后一个参数。

我不完全理解变量参数类型是最后一个的要求。任何输入都会有所帮助。


答案 1

变量参数必须是最后一个,以便编译器可以计算出哪个参数是哪个参数。

例如,假设您通过了

“测试”, “测试”, “测试”, “测试”

进入您的函数

public void someStuff(Object ... args, String a)

Java 无法确定您是否希望 args 变量包含 3 个或 4 个字符串。在撰写本文时,它可能对你来说是显而易见的,但它是模棱两可的。

但是,当情况恰恰相反时

public void someStuff(String a, Object ... args)

Java编译器看到第一个字符串,将其粘贴到“a”中,然后知道剩余的字符串可以安全地放入args中,并且变量没有歧义。


答案 2

它遵循 C 约定。反过来,C 约定基于在堆栈上传递参数的 CPU 体系结构。第一个非 vararg 参数最终在堆栈帧中的固定偏移处结束。如果您可以将 vararg 参数放在第一位,则以下参数的堆栈偏移量将取决于您传递了多少个 vararg 参数。这将使访问它们所需的代码量大大复杂化。

在您的示例中,使用 first,它在概念上与后面的 vararg 参数数无关,在偏移量为 0 处。但是对于最后一个,它可以在偏移0,4,8,12等处 - 你必须计算每次你需要的时间。String aString aargs.size * 4String a