2011-09-12 209 views
9

我花了一些時間想知道是否可以編寫一個guice模塊 ,它本身是用類型T進行參數化的,並使用其類型參數 來指定綁定。具有類型參數的Guice模塊

如在此(不工作),例如:

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

我嘗試不同的方法路過試圖通過噸至Mymodule中爲 類/ TypeLiteral的實例,但沒有一次成功。 幫助讚賞。

問候,盧卡斯Osipiuk

回答

12

對於您將不得不從頭開始構建各自TypeLiteral,使用com.google.inject.util.Types。你可以做這樣的事情:

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

請注意,私有方法newGenericType()將執行的類型沒有控制權,這是你的責任,在configure(),以確保泛型類型可以與正確編譯方法。

+0

非常感謝 - 作品像一個魅力:) – losipiuk

+0

不客氣,我很高興我能幫上忙。我知道我已經在我的膽量活動庫中使用了這種先進的東西,所以要適應我過去所做的例子並不難。 – jfpoilpret

相關問題