我正在为我们的项目尝试Google 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来说是否可能?
答案 0 :(得分:1)
GIN似乎无法做到这一点。
有几种解决方法: