我正在为我们的项目尝试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来说可能吗?
GIN似乎不可能做到这一点。
有几种解决方法:
- 让GIN注入一个IFace或IFace,然后强制转换为所需类型
- 为IFace编写一个工厂,并注入一个在通用工厂方法中执行强制转换的提供程序。注入该工厂并从工厂获得IFace的类型安全实例