4

私は次の問題のエレガントな解決策を探しています:

//one interface
public interface MyInterface () {
}
//two implementations
public class ImplA implements MyInterface (){ 
}
public class ImplB implements MyInterface () {
}

別のクラス:

//one generic method
public void myMethod(Class<MyInterface>... myTypes) {
  for (Class<MyInterface> myType : myTypes) {
     System.err.println("my Type:" +myType);
  }
}

問題は、次のコマンドでこのメソッドを単純に呼び出すことができないことです。

myMethod(ImplA.class, ImplB.class);

これは単に受け入れられません。オプションのパラメーターとジェネリックを組み合わせることはできないというのは本当ですか?例が見つかりません。

4

5 に答える 5

2

私は試してみます

public void myMethod(Class<? extends MyInterface>... myTypes) {

Class<MyInterface>MyInterface.classサブクラスであってはなりません。

于 2012-09-05T13:59:47.877 に答える
1

引数の型を共変にする必要があります (上限を定義します)。署名を持つタイプは 1 つだけClass<X>で、それはX.classです。サブタイプは typeClass<? extends X>です。そう:

@SafeVarargs 
public void myMethod(Class<? extends MyInterface>... myTypes) {
  // do stuff
}
于 2012-09-05T14:00:01.757 に答える
1

? extendsワイルドカードを使用して機能させます。

public void myMethod(Class<? extends MyInterface>... myTypes) {
    for (Class<? extends MyInterface> myType : myTypes) {
        System.err.println("my Type:" +myType);
    }
}

最初に行った方法では、各実装者の参照MyInterfaceタイプが. 私の提案した方法では、参照を のMyInterfaceか、または任意の子 (孫など) にすることができますMyInterface

于 2012-09-05T13:59:05.100 に答える
0

次のようなことを試すことができます:

public  void  myMethod(Class<? extends MyInterface>... myTypes) {
      for (Class<?> myType : myTypes) {
         System.err.println("my Type:" +myType);
      }
    }
于 2012-09-05T14:02:48.967 に答える
0

ジェネリック型を宣言するには、境界付きワイルドカードを使用する必要があります-Class<? extends MyInterface>

public void myMethod(Class<? extends MyInterface>... myTypes) {
  for (Class<? extends MyInterface> myType : myTypes) {
     System.err.println("my Type:" +myType);
  }
}
于 2012-09-05T14:03:13.303 に答える