不止一个varargs论点

时间:2014-07-23 08:48:42

标签: java

当我输入以下代码时出现编译时错误:

public void myMethod(Foo... f, Bar... b) {

}

它说varargs必须是最后一个参数,有没有其他方法来实现这种功能?

5 个答案:

答案 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,fooObj2fooObj3将应用于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,这只是一个建议,但我可能错了。