为什么 varargs 应该是方法签名中的最后一个?
2022-09-01 21:52:32
如果我试图写一个如下的方法
public void someStuff(Object ... args, String a )
我收到此错误
方法 someStuff 的变量参数类型 Object 必须是最后一个参数。
我不完全理解变量参数类型是最后一个的要求。任何输入都会有所帮助。
如果我试图写一个如下的方法
public void someStuff(Object ... args, String a )
我收到此错误
方法 someStuff 的变量参数类型 Object 必须是最后一个参数。
我不完全理解变量参数类型是最后一个的要求。任何输入都会有所帮助。
变量参数必须是最后一个,以便编译器可以计算出哪个参数是哪个参数。
例如,假设您通过了
“测试”, “测试”, “测试”, “测试”
进入您的函数
public void someStuff(Object ... args, String a)
Java 无法确定您是否希望 args 变量包含 3 个或 4 个字符串。在撰写本文时,它可能对你来说是显而易见的,但它是模棱两可的。
但是,当情况恰恰相反时
public void someStuff(String a, Object ... args)
Java编译器看到第一个字符串,将其粘贴到“a”中,然后知道剩余的字符串可以安全地放入args中,并且变量没有歧义。
它遵循 C 约定。反过来,C 约定基于在堆栈上传递参数的 CPU 体系结构。第一个非 vararg 参数最终在堆栈帧中的固定偏移处结束。如果您可以将 vararg 参数放在第一位,则以下参数的堆栈偏移量将取决于您传递了多少个 vararg 参数。这将使访问它们所需的代码量大大复杂化。
在您的示例中,使用 first,它在概念上与后面的 vararg 参数数无关,在偏移量为 0 处。但是对于最后一个,它可以在偏移0,4,8,12等处 - 你必须计算每次你需要的时间。String a
String a
args.size * 4
String a