1

A と B の 2 つのクラスがあります。A には、任意の型の任意の数のパラメーターを持つことができるメソッド、たとえば foo があります。このメソッドは、これらのパラメータを、事前に定義されたタイプの事前に定義された数のパラメータを持つメソッドに中継します。

Class A{
   foo(<?> ... params){
      (new B()).bar(params);
   }
} 

Class B{
   bar(int a, int b){
       Log.v("The params passed are "+a+" and "+b);
   }
}

Class Caller{

    callingMethod(){
        (new A()).foo(1, 2);
    }
}

私が書き留めた foo の署名をコンパイラが許可しないことはわかっています。私が達成しようとしていることを説明するためだけにそれを書きました。

クラス B の bar(int, int) でキャストを行いたくありません。

4

4 に答える 4

2

可変引数を使用できます...

public static void foo(Object... parameters ){

}
于 2012-09-18T13:48:26.003 に答える
1

Object他の人が示唆しているように、可変数のs を関数パラメーターとして受け入れることができます。注意が必要なのは、それを展開して呼び出すことbarですB。リフレクションを使用してそれを行う方法の例をまとめました。

import java.lang.reflect.Method;

public class test {
  static class A {
    private final Class cl;
    A(Class cl) { 
      this.cl = cl;
    }
    void foo(Object ... params) throws Exception {
      Object obj = cl.newInstance();
      for (Method m : cl.getMethods()) {
        if (m.getName().equals("bar")) {
          try {
            m.invoke(obj, params);
            return;
          }
          catch(IllegalArgumentException ex) {} // try next overload
        }
      }
      throw new IllegalArgumentException();
    }
  }

  static class B {
    public void bar() {
      System.out.println("Got nothing");
    }

    public void bar(double a, double b) {
      System.out.println("Got doubles");
    }

    public void bar(int a, int b) {
      System.out.println("Got: " + a + " and " + b);
    }
  }

  public static void main(String argv[]) throws Exception {
    new A(B.class).foo(1,2);
    new A(B.class).foo();
    new B().bar(1,2);
    new A(B.class).foo("Hello");
  }
}

しかし、お気づきのように、オーバーロードの解決はここでは完全ではなく、 のオーバーロードを1,2呼び出して渡します。これを回避するには、与えられた各オブジェクトに最もよく一致するようにオブジェクトの配列を並べ替える必要がありますが、それは私の知る限りでは些細なことではありません。double,doublebarMethodClass

于 2012-09-18T14:22:16.077 に答える
1

varargs の前に固定されている限られた数のパラメーターを追加できます。これはで実装されていますEnumSet

メソッドを呼び出すためのパラメーターが少なくとも 2 つあることを保証するfoo3 つのパラメーターを受け入れるメソッドに変更しました。E e1, E e2, E... paramsbar(e1, e2)

<E extends Number>Number Integerのサブクラスをたまたま 1 つに渡すことができることを保証します。

static class A {
    <E extends Number> void foo(E e1, E e2, E... params) {
        (new B<E>()).bar(e1, e2);
    }
}

static class B<E extends Number> {
    public void bar(E a, E b) {

    }
}

public static void main(String[] args) {

    A name = new A();
    name.foo(1, 2, 123);
}
于 2012-09-18T13:47:31.537 に答える
0

Java の可変引数:

foo(Object... objs) {}

例:

public static void main(String... args) {}

と同等です

public static void main(String[] args) {}

注: メソッド シグネチャに残りの引数がない限り、配列を使用することと同等です。

于 2012-09-18T13:57:33.077 に答える