1

我正在为我们的项目尝试 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 吗?

4

1 回答 1

1

似乎这对 GIN 是不可能的。

有几种解决方法:

  • 让 GIN 注入一个 IFace 或 IFace 然后转换为所需的类型
  • 为 IFace 编写一个工厂,并注入一个在通用工厂方法中执行强制转换的 Provider。注入该工厂并从工厂获取 IFace 的类型安全实例。
于 2012-03-21T08:09:04.003 回答