首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用可变数量的参数委托方法调用

使用可变数量的参数委托方法调用
EN

Stack Overflow用户
提问于 2010-01-21 06:19:02
回答 4查看 1.5K关注 0票数 0

这个问题是在我的编程工作过程中出现的;它已经变得与当前的任务无关,但我仍然很好奇是否有人有答案。

在Java 1.5和更高版本中,您可以使用数量可变的参数来使用方法签名,并使用省略号语法:

代码语言:javascript
复制
public void run(Foo... foos) {
  if (foos != null) {
   for (Foo foo: foos) { //converted from array notation using autoboxing
    foo.bar();
   }
  }
}

假设我想对foos列表中的每个foo执行一些操作,然后将此调用委托给我的对象上的某个字段,保留相同的API。我该怎么做呢?我想要的是:

代码语言:javascript
复制
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();
   }
  }
}

这不能编译。我如何才能做到这一点(将可变数量的MyFoo传递给run(MyFoo...)方法)?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-21 07:06:26

我试过了,没有得到编译错误。您看到的实际错误是什么?下面是我使用的代码。也许我做了一些不同的事情:

代码语言:javascript
复制
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); 
}

}

票数 1
EN

Stack Overflow用户

发布于 2010-01-21 06:26:58

这是你想要的吗?

代码语言:javascript
复制
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());
    }

}
票数 2
EN

Stack Overflow用户

发布于 2010-01-21 06:42:52

这并没有回答您的问题;这是偶然的,但是您不需要null测试。以下是证据:

代码语言:javascript
复制
public class VarargsTest extends TestCase {

    public void testVarargs() throws Exception {
        assertEquals(0, fn());
    }

    private int fn(String...strings) {
        return strings.length;
    }
}

如果在没有任何参数的情况下调用该方法,则varargs列表是一个空数组,而不是null。

我认为对你的问题的实际解决方案是重命名第二个函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2105436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档