如何使用GIN为泛型接口创建到泛型实现的默认绑定



我正在为我们的项目尝试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的类型安全实例

相关内容

  • 没有找到相关文章

最新更新