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.