2011-09-12 19 views
9

Spędziłem trochę czasu zastanawiając się, czy można napisać moduł guilowy , który sam jest parametryzowany z typem T i używa jego parametru typu do określenia powiązań.Moduł Guice z parametrami typu

jak w tym (nie pracuje) Przykład:

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>>(){}); 
    } 
} 

Próbowałem różnych podejść przepuszczenie stara się przekazać T mymodule jako instancji Class/TypeLiteral ale żaden z nich nie pracował. Pomoc doceniona.

Pozdrawiam, Łukasz Osipiuk

Odpowiedz

12

Do tego trzeba będzie budować każdą TypeLiteral od podstaw, przy użyciu com.google.inject.util.Types. Można zrobić coś takiego:

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; 
} 

Zwróć uwagę, że newGenericType metoda prywatny() wykona żadnego wpływu na rodzaje, to Twoim obowiązkiem, w configure(), aby upewnić się, że typy generyczne mogą być poprawnie zbudowany, że metoda.

+0

Wielkie dzięki - działa jak urok :) – losipiuk

+0

Nie ma za co, cieszę się, że mogłem pomóc. Wiedziałem, że użyłem już tego rodzaju zaawansowanych rzeczy w mojej bibliotece wydechowej, więc nie było trudno przystosować twój przykład z przeszłości. – jfpoilpret