如何使用GIN为通用实现创建默认绑定?

时间:2012-03-19 15:14:18

标签: generics gwt 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来说是否可能?

1 个答案:

答案 0 :(得分:1)

GIN似乎无法做到这一点。

有几种解决方法:

  • 让GIN注入IFace或IFace,然后转换为所需的类型
  • 为IFace编写一个工厂,注入的Provider在通用工厂方法中执行强制转换。注入该工厂并从工厂获得一个类型安全的IFace实例。