2012-03-19 6 views
1

私たちのプロジェクトのためのGoogle GINをしようとしていますし、私は一般的なインタフェースとそのインタフェースの一般的な実装を持っている場合に出くわした:GINを使用したジェネリックインプリメンテーションへのジェネリックインターフェイスのデフォルトバインディングの作成方法は?

public interface IFace<T> { 
    void setEntry(T t); 
} 

public class Face<T> implements IFace<T> { 
    public void setEntry(T t) { 
    } 
} 

今、私が注入さIFACEを必要とするインタフェースのユーザを持っています

public class IFaceUser { 
    private IFace<String> face; 

    @Inject 
    public IFaceUser(IFace<String> face) { 
     this.face = face; 
    } 
} 

私はbind(IFace.class).to(Face.class);と実装へのインターフェースをバインドしようとした場合、注射は

Deferred binding result type 'IFace' should not be abstract 
で失敗します。コンストラクタで

GINはIFace<String>のバインディングを検出せず、IFaceに戻り、バインディングを使用してGWT.create(IFace.class)を試行します。

bind(new TypeLiteral<IFace>(){}).to(new TypeLiteral<Face>(){});bind(new TypeLiteral<IFace<?>>(){}).to(new TypeLiteral<Face<?>>(){});も成功しませんでした。

IFace<String>からFace<String>にバインドできることはわかっていますが、それはその中にたくさんの繰り返しコードを持つ巨大なモジュールにつながる可能性があります。 @ImplementedBy(Face.class)を使用することもできますが、これはオプションではありません。

魔法はありますか?使用する必要があるのはbind(...).to(...)ですか?これはGINでも可能ですか?

答えて

1

GINではこれができないようです。

いくつかの回避策があります。その後、

  • はGINはIFACEかのifaceを注入しようと希望のタイプ
  • にキャストプロバイダとのifaceのための工場を書くことは、一般的なファクトリメソッドでキャストを行い、注入されました。その工場に注入し、工場からIFaceのタイプセーフなインスタンスを取得します。
関連する問題