私は私たちのプロジェクトで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でも可能ですか?