0

この質問は、私の仕事のプログラミングの過程で出てきました。それは現在のタスクとは無関係になりましたが、誰かが答えを持っているかどうか私はまだ興味があります。

Java 1.5以降では、省略記号構文を使用して、可変数の引数を使用してメソッドシグネチャを使用できます。

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();
   }
  }
}

これはコンパイルされません。どうすればこれを達成できますか(可変数のMyFooをrun(MyFoo ...)メソッドに渡す)?

4

4 に答える 4

2

これは、あなたの望むことですか?

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());
    }

}
于 2010-01-20T22:26:57.553 に答える
1

試してみましたが、コンパイルエラーは発生しませんでした。あなたが見ている実際のエラーは何ですか?これが私が使用したコードです。おそらく私は何か違うことをしました:

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); 
}

}

于 2010-01-20T23:06:25.860 に答える
0

これはあなたの質問に答えません。偶発的ですが、nullテストは必要ありません。ここに証拠があります:

public class VarargsTest extends TestCase {

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

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

メソッドが引数なしで呼び出された場合、varargsリストは空の配列であり、nullではありません。

あなたの質問に対する実際の解決策は、2番目の関数の名前を変更することだと思います。

于 2010-01-20T22:42:51.853 に答える
-1

Javaリフレクションを使用します。

于 2010-01-20T22:22:55.443 に答える