2011-09-12 16 views
9

Pasé algún tiempo preguntándome si es posible escribir un módulo de guice que a su vez está parametrizado con tipo T y usa su parámetro de tipo para especificar enlaces.Módulo de Guice con parámetros de tipo

Como en este ejemplo (no de trabajo):

interface A<T> {} 
class AImpl<T> implements A<T>{} 
interface B<T> {} 
class BImpl<T> implements B<T> {} 

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

He intentado diferentes enfoques que pasaban tratando de pasar a T MyModule como instancia de la clase /TypeLiteral pero ninguno de ellos trabajaron. Ayuda apreciada.

Saludos, Łukasz Osipiuk

Respuesta

12

Para que va a tener para construir cada TypeLiteral desde cero, usando com.google.inject.util.Types. Se podría hacer algo así:

class MyModule<T> extends AbstractModule { 
    public MyModule(TypeLiteral<T> type) { 
     _type = type; 
    } 

    @Override protected void configure() { 
     TypeLiteral<A<T>> a = newGenericType(A.class); 
     TypeLiteral<AImpl<T>> aimpl = newGenericType(AImpl.class); 
     bind(a).to(aimpl); 
     TypeLiteral<B<T>> b = newGenericType(B.class); 
     TypeLiteral<BImpl<T>> bimpl = newGenericType(BImpl.class); 
     bind(b).to(bimpl); 
    } 

    @SuppressWarnings("unchecked") 
    private <V> TypeLiteral<V> newGenericType(Class<?> base) { 
     Type newType = Types.newParameterizedType(base, _type.getType()); 
     return (TypeLiteral<V>) TypeLiteral.get(newType); 
    } 

    final private TypeLiteral<T> _type; 
} 

Tenga en cuenta que el newGenericType método privado() llevará a cabo ningún control sobre los tipos, es su responsabilidad, en configure(), para asegurarse de que los tipos genéricos se pueden construir correctamente con esa método.

+0

Muchas gracias - funciona como un encanto :) – losipiuk

+0

De nada, me alegro de poder ayudar. Sabía que ya había usado este tipo de material avanzado en mi biblioteca de eventos de tripa, así que no fue muy difícil adaptar tu ejemplo de lo que había hecho en el pasado. – jfpoilpret

Cuestiones relacionadas