当我输入以下代码时出现编译时错误:
public void myMethod(Foo... f, Bar... b) {
}
它说varargs必须是最后一个参数,有没有其他方法来实现这种功能?
答案 0 :(得分:4)
这是不可能的,因为第二个参数无法确定。
要理解为什么它应该是最后一个参数, 考虑一下你的方法
public void myMethod(Foo... f, Foo f1){}
现在假设您使用myMethod(fooObj1, fooObj2, fooObj3);
所有foo参数都将应用于var-arg方法参数。因此,没有办法告诉特定对象作为第二个参数传递。
现在,当你将var-arg作为最后一个参数时,
public void meMethod(Foo f1, Foo... f){}
方法调用myMethod(fooObj1, fooObj2, fooObj3);
会将fooObj1
分配给f1,fooObj2
和fooObj3
将应用于var-arg f
要解决此问题,您必须执行
public void myMethod(Foo[] f, Bar... b) {
}
答案 1 :(得分:0)
不可能,你必须这样做
public void myMethod(Foo[] f, Bar... b) {
}
作为解决方法。
答案 2 :(得分:0)
方法中只能有一个varargs。 Varargs必须是最后一个正式参数。
尝试
public void myMethod(Foo[] f, Bar... b) {
}
答案 3 :(得分:0)
java中只允许一个varargs
参数,它必须是签名的最后一个参数。Multiple vararg
参数可以导致ambiguity
,因为你可能会对第一个结束的地方感到困惑第二个开始的地方。
varargs
转换为数组,因此您可以简单地传递两个数组。
答案 4 :(得分:0)
这是Java的规则之一,在方法签名中,你只能有一个vararg,并且在参数列表的末尾。
来自" SCJP Sun认证Java程序员",以下是有效和无效的方法签名:
// Legal:
// expects from 0 to many ints as parameters
void doStuff(int... x);
// expects first a char, then 0 to many ints
void doStuff2(char c, int... x);
// 0 to many Animals
void doStuff3(Animal... animal);
// Illegal:
// bad syntax
void doStuff4(int x...);
// too many var-args
void doStuff5(int... x, char... y);
// var-arg must be last
void doStuff6(String... s, byte b);
如果你真的想要一些Foo和Bar,如果他们有共同点,也许你可以有像
这样的方法public void myMethod(CommonParentClassOrInterface... f);
并对每个人的实际班级进行一些检查,但是你没有保证你会首先得到Foo,然后是Bar。
我还没有真正使用过varargs,这只是一个建议,但我可能错了。