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

时间:2015-02-25 02:44:10

标签: java generics dependency-injection guice

我希望能够使用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());

使用我的提供者类:

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说我没有执行任何约束......

非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

您尚未使用给定的注释定义C.class的绑定。您定义的唯一带注释的绑定是A.class。我无法肯定地说出了什么是错误的,因为代码的其他部分并没有完全合理(SSCCE一如既往地有助于我们帮助你),但我&#39 ; m猜测如果你改变你的测试行来要求A而不是C的实例,你就会得到你期望的行为。

这是一个SSCCE的一个很好的例子,可以消除任何可能出现的混淆......除了这个是由我在一个已经混乱的状态下构建的事实。 :-)如果我做的事与你想要的不同,那是因为我不得不猜测。

请注意,我正在向注射器询问A的实例,并获得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);
}

此时您的问题似乎与泛型无关,尽管此处还有一些其他可疑决策 与泛型有关。