Module Guice avec parameters de type

Je me suis demandé quelque temps s’il était possible d’écrire un module guice paramétré avec le type T lui-même et utilisant son paramètre type pour spécifier des liaisons.

Comme dans cet exemple (qui ne fonctionne pas):

interface A {} class AImpl implements A{} interface B {} class BImpl implements B {} class MyModule extends AbstractModule { @Override protected void configure() { bind(new TypeLiteral<A>(){}).to(new TypeLiteral<AImpl>(){}); bind(new TypeLiteral<B>(){}).to(new TypeLiteral<BImpl>(){}); } } 

J’ai essayé différentes approches en essayant de passer T à MyModule en tant qu’instance de Class / TypeLiteral mais aucune d’entre elles n’a fonctionné. Aide appréciée.

Cordialement, Łukasz Osipiuk

Pour cela, vous devrez construire chaque typeLiteral à partir de zéro, en utilisant com.google.inject.util.Types . Vous pourriez faire quelque chose comme ça:

 class MyModule extends AbstractModule { public MyModule(TypeLiteral type) { _type = type; } @Override protected void configure() { TypeLiteral> a = newGenericType(A.class); TypeLiteral> aimpl = newGenericType(AImpl.class); bind(a).to(aimpl); TypeLiteral> b = newGenericType(B.class); TypeLiteral> bimpl = newGenericType(BImpl.class); bind(b).to(bimpl); } @SuppressWarnings("unchecked") private  TypeLiteral newGenericType(Class base) { Type newType = Types.newParameterizedType(base, _type.getType()); return (TypeLiteral) TypeLiteral.get(newType); } final private TypeLiteral _type; } 

Veuillez noter que la méthode privée newGenericType () n’effectuera aucun contrôle sur les types; c’est votre responsabilité, dans configure() , de vous assurer que les types génériques peuvent être construits correctement avec cette méthode.