1

私は私たちのプロジェクトでGoogleGINを試していますが、一般的なインターフェイスとそのインターフェイスの一般的な実装がある場合に遭遇しました。

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でも可能ですか?

4

1 に答える 1

1

これはGINでは不可能のようです。

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

  • GIN に IFace または IFace を注入させてから、目的の型にキャストします。
  • ジェネリック ファクトリ メソッドでキャストを実行する Provider を挿入して、IFace のファクトリを記述します。そのファクトリを注入し、ファクトリから IFace の型保証されたインスタンスを取得します。
于 2012-03-21T08:09:04.003 に答える