2017-10-05 15 views
0

私はDIのためにGuiceを使用しています。私は今作成している手作業のバインディングの代わりにジェネリッククラスの動的バインディングを作成したいと思います。Guice - プログラムで作成されたバインディング

マニュアルの方法は、これまで正常に動作している:

 bind(new TypeLiteral<DAOService<SourceSystem, UUID>>() {}) 
      .to(new TypeLiteral<DAOServiceImpl<SourceSystem, UUID>>() {}); 

をしかし、私はこのような何かをしたい:

final String poPackage = PersistableObject.class.getPackage().getName(); 
    final Reflections r = new Reflections(poPackage); 
    final Class<DAOService> ifClass = DAOService.class; 
    final Class<DAOServiceImpl> implClass = DAOServiceImpl.class; 

    for (Class<? extends PersistableObject> dbClass : r.getSubTypesOf(PersistableObject.class)) { 
     final ParameterizedType ifPt = Types.newParameterizedType(ifClass, dbClass, UUID.class); 
     final ParameterizedType implPt = Types.newParameterizedType(implClass, dbClass, UUID.class); 

     final TypeLiteral<?> fromLiteral = TypeLiteral.get(ifPt); 
     final TypeLiteral<?> toLiteral = TypeLiteral.get(implPt); 

     bind(fromLiteral).to(toLiteral); // not compiling! 
    } 

ので、これはコンパイルされません:

[50,30] no suitable method found for to(com.google.inject.TypeLiteral<capture#1 of ?>) 

がありますGuiceで動的に作成されたTypeLiteralsを使用してプログラムでバインディングを作成する可能性

+0

「動的に」したいのはなぜですか? –

+1

あなたは型リテラルを構築する方法のために安全だと知っています...だから、それを行うためのハックな方法は、型リテラルから ''を落とし、生の型を使用することです。 –

+0

@AndyTurner:ありがとう - それはそれを解決しました。 –

答えて

1

@AndyTurnerに感謝します。 TypeLiteral<?>を削除して、mの問題を解決してください。これはコンパイルして動作しています:

final Class<UUID> idClass = UUID.class; 
    final Class<DAOService> ifClass = DAOService.class; 
    final Class<DAOServiceImpl> implClass = DAOServiceImpl.class; 

    for (Class<? extends PersistableObject> dbClass : r.getSubTypesOf(PersistableObject.class)) { 
     final ParameterizedType ifPt = Types.newParameterizedType(ifClass, dbClass, idClass); 
     final ParameterizedType implPt = Types.newParameterizedType(implClass, dbClass, idClass); 
     final TypeLiteral fromLiteral = TypeLiteral.get(ifPt); 
     final TypeLiteral toLiteral = TypeLiteral.get(implPt); 

     bind(fromLiteral).to(toLiteral); 
    } 
関連する問題