Java 使用可变数量的参数委派方法调用
这个问题是在我的工作规划过程中提出的;这与当前的任务无关,但我仍然好奇是否有人有答案 在Java 1.5及更高版本中,您可以使用数量可变的参数和省略号语法获得方法签名:Java 使用可变数量的参数委派方法调用,java,variadic-functions,Java,Variadic Functions,这个问题是在我的工作规划过程中提出的;这与当前的任务无关,但我仍然好奇是否有人有答案 在Java 1.5及更高版本中,您可以使用数量可变的参数和省略号语法获得方法签名: public void run(Foo... foos) { if (foos != null) { for (Foo foo: foos) { //converted from array notation using autoboxing foo.bar(); } } } 假设我想对foos列表
public void run(Foo... foos) {
if (foos != null) {
for (Foo foo: foos) { //converted from array notation using autoboxing
foo.bar();
}
}
}
假设我想对foos列表中的每个foo执行一些操作,然后将此调用委托给对象上的某个字段,保留相同的API。我怎么做?我想要的是:
public void run(Foo... foos) {
MyFoo[] myFoos = null;
if (foos != null) {
myFoos = new MyFoo[foos.length];
for (int i = 0; i < foos.length; i++) {
myFoos[i] = wrap(foos[i]);
}
}
run(myFoos);
}
public void run(MyFoo... myFoos) {
if (myFoos!= null) {
for (MyFoo myFoo: myFoos) { //converted from array notation using autoboxing
myFoo.bar();
}
}
}
公共作废运行(Foo…foos){
MyFoo[]myFoos=null;
如果(foos!=null){
myFoos=新的MyFoo[foos.length];
for(int i=0;i
这不能编译。如何实现这一点(将可变数量的MyFoo传递给run(MyFoo…)方法)?使用java反射。这是您想要的吗
public class VarArgsTest {
public static class Foo {}
public static class MyFoo extends Foo {
public MyFoo(Foo foo) {}
}
public static void func(Foo... foos) {
MyFoo [] myfoos = new MyFoo[foos.length];
int i=0;
for (Foo foo : foos) {
myfoos[i++] = new MyFoo(foo);
}
func(myfoos);
}
public static void func(MyFoo... myfoos) {
for (MyFoo m : myfoos) {
System.out.println(m);
}
}
public static void main(String [] args) throws Exception {
func(new Foo(), new Foo(), new Foo());
}
}
这并不能回答你的问题;这是偶然的,但不需要空测试。以下是证据:
public class VarargsTest extends TestCase {
public void testVarargs() throws Exception {
assertEquals(0, fn());
}
private int fn(String...strings) {
return strings.length;
}
}
如果在没有任何参数的情况下调用该方法,则varargs列表是一个空数组,而不是null
我认为解决您问题的实际方法是重命名第二个函数。我尝试过,但没有得到编译错误。您看到的实际错误是什么?这是我使用的代码。也许我做了一些不同的事情:
public class MultipleArgs {
public static void main(String [] args){
run(new Foo("foo1"), new Foo("foo2"), new Foo("foo3"));
}
public static void run(Foo... foos){
MyFoo[] myFoos = null;
if (foos != null) {
myFoos = new MyFoo[foos.length];
for (int i = 0; i < foos.length; i++) {
myFoos[i] = wrap(foos[i]);
}
}
run(myFoos);
}
public static void run(MyFoo... myFoos){
if (myFoos!= null) {
for (MyFoo myFoo: myFoos) {
myFoo.bar();
}
}
}
private static class Foo {
public final String s;
public Foo(String s){
this.s = s;
}
@Override
public String toString(){
return s;
}
}
private static class MyFoo{
private final String s;
public MyFoo(String s){
this.s = s;
}
public void bar(){
System.out.println(s);
}
@Override
public String toString(){
return s;
}
}
private static MyFoo wrap(Foo foo){
return new MyFoo(foo.s);
}
公共类多线程{
公共静态void main(字符串[]args){
运行(新Foo(“foo1”)、新Foo(“foo2”)、新Foo(“foo3”);
}
公共静态无效运行(Foo…foos){
MyFoo[]myFoos=null;
如果(foos!=null){
myFoos=新的MyFoo[foos.length];
for(int i=0;i
}不编译如何?发布错误消息和丢失的方法签名(wrap,myFoo.bar)。我无法再重现该问题,因此我一定犯了其他错误,并误解了它给我的编译错误。感谢每一位提供示例代码来帮助我们的人。我将第一个提交的代码标记为正确答案。-1除非您能给出使用反射的原因,以及如何使用反射来实现OP目标的示例