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