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

私は クラス/ TypeLiteralのインスタンスとしてのmymoduleするTを渡そうと渡し異なるアプローチを試みたが、それらのどれも働きました。 ヘルプをいただければ幸いです。

よろしく、ルカシュOsipiukあなたがcom.google.inject.util.Typesを使用して、ゼロから各TypeLiteralを構築する必要がありますそのために

答えて

12

。あなたはそのような何か行うことができます:

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

関連する問題