如何使用 guice 注入通用接口实现

How inject generic interface implementation with guice

a我希望能够使用 Guice 注释注入通用接口的实现

让我向您展示我的代码:

public interface A<T>{
}

public abstract class B<T> implements A<T>{
}

public class C extends B<T> {
}

所以我创建了一个注释 MyAnnotation,现在我无法在我的模块中正确绑定它:

this.bind(Key.get(A.class, new MyAnnotationImpl("id")))
.toProvider(new MyProvider());

与我的提供商 class :

public class MyProvider implements Provider<A<?>> {

        @Override
        public A<?> get() {
            return (A<?>) getInjector().getInstance(C.class);
        }

    }

然后我的测试:

this.getInjector().getInstance(Key.get(A.class, new MyAnnotationImpl("id")));

Guice 说我没有绑定任何实现....

如有任何帮助,我们将不胜感激

您尚未使用给定注释为 C.class 定义绑定。您定义的唯一带注释的绑定是 A.class。我不能确定到底哪里出了问题,因为您代码的其他部分没有完全意义(SSCCE 一如既往地有助于帮助我们帮助您),但我猜如果您更改您的测试行以请求 A 而不是 C 的实例,您将获得您期望的行为。

这是 SSCCE 的一个很好的例子,它消除了关于正在尝试做什么的任何可能的混淆......除了这个是我在已经混淆的状态下构建的。 :-) 如果我做的事情与您的预期不同,那是因为我不得不猜测。

请注意,我向注入器请求 A 的实例,并在 return 中获取 C 的实例。

static interface A<T> {}
static abstract class B<T> implements A<T> {}
static class C<T> extends B<T> {}

static class MyModule extends AbstractModule {
  @Override protected void configure() {
    bind(Key.get(A.class, Names.named("id"))).toProvider(new MyProvider());
  }
}

static class MyProvider implements Provider<A<?>> {
  @Inject Injector injector;
  @Override public A<?> get() {
    return (A<?>) injector.getInstance(C.class);
  }
}

public static void main(String[] args) {
  Injector injector = Guice.createInjector(new MyModule());
  A<?> a = injector.getInstance(Key.get(A.class, Names.named("id")));

  System.out.println(a instanceof A);
  System.out.println(a instanceof B);
  System.out.println(a instanceof C);
}

你的问题目前似乎与泛型无关,尽管这里做出的其他一些有问题的决定与泛型有关。