1

先に進む方法がわからない点にぶつかりました.次のコードを持つクラスがあります

public class MyClass{

  private Class<? extends ValidationProvider> providerClass;
  //getter ans setter

}

Provider クラスは実行時に渡され、そのために異なる実装が存在する可能性がありますが、上記の契約に従う必要があります? extends ValidationProvider

私の実装では、ユーザーがプロバイダー名クラスを渡すことができるプロパティを提供しました。それに基づいて、先に進む必要があります。先に進むには、依存性注入メカニズムのビルドを使用してプロバイダー クラスのインスタンスを取得する必要があります。

 public class MyClass{

      private Class<? extends ValidationProvider> providerClass;
      //getter ans setter

      public void setProvider(){
         providerClass=container.getInstance("type","name");
      }
    }

の署名container.getInstance("type","name");

 <T> T getInstance(Class<T> type, String name);

タイプをコンテナーに渡し、プロバイダー クラスのインスタンスを取得する方法がわかりません (プロバイダー クラスには署名があるため<? extends ValidationProvider>)。

単純なユースケースの場合、次のようにできます

container.getInstance(String.class,"my constant");

しかし、私のユースケースでそれを行う方法がわかりません。この点での助けは本当にありがたいです。

4

1 に答える 1

0

一歩戻ってみましょう...あなたの要件は、MyClassのさまざまな実装で構成可能でなければならないということValidationProviderです。これは、構文からスーパークラスであると想定しています。これを達成するためにジェネリックが必要だとは思いませんMyClass

public class MyClass{

    private ValidationProvider provider;

    public void setProvider(ValidationProvider _provider){
        this.provider = _provider;
    }
}

次に、(たとえば) 構成ファイルで正確なプロバイダー実装の完全修飾名を持つことによって構成が達成される場合、MyClass次のようにインスタンスを設定できます。

...
String validatorClassName;
...
// Assign validatorClassName a value from a config file
...
ValidationProvider v = container.getInstance(Class.forName(validatorClassName), "blah");
myClass.setProvider(v);
于 2012-09-30T11:29:41.273 に答える