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

Java 如何用guice注入通用接口实现,java,generics,dependency-injection,guice,Java,Generics,Dependency Injection,Guice,aI希望能够使用Guice注释注入通用接口的实现 让我向您展示我的代码: public interface A<T>{ } public abstract class B<T> implements A<T>{ } public class C extends B<T> { } 使用我的提供者类: public class MyProvider implements Provider<A<?>> {

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

让我向您展示我的代码:

public interface A<T>{
}

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

public class C extends B<T> {
}
使用我的提供者类:

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

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

    }
Guice告诉我没有任何实施约束


如果您没有使用给定的注释为
C.class
定义绑定,我们将不胜感激。您定义的唯一带注释的绑定是针对
A.class
。我不能确切地说什么是错误的,因为代码的其他部分没有完全意义(a一如既往地有助于帮助我们帮助您),但我猜想,如果您更改测试行以请求
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);
}
静态接口A{}
静态抽象类B实现了一个{}
静态类C扩展了B{}
静态类MyModule扩展了AbstractModule{
@覆盖受保护的void configure(){
bind(Key.get(A.class,Names.named(“id”)).toProvider(newmyProvider());
}
}
静态类MyProvider实现Provider get(){
返回(A)injector.getInstance(C.class);
}
}
公共静态void main(字符串[]args){
Injector=Guice.createInjector(新的MyModule());
A=injector.getInstance(Key.get(A.class,Names.named(“id”));
System.out.println(a的一个实例);
System.out.println(B的a实例);
System.out.println(C的一个实例);
}

您的问题在这一点上似乎与泛型无关,尽管这里还有一些与泛型相关的可疑决定。

谢谢,我是stackoverflow领域的新手,我解决了我的问题。这是我配置中的一个内部错误。Guice没有加载我的模块非常感谢你的建议
this.getInjector().getInstance(Key.get(A.class, new MyAnnotationImpl("id")));
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);
}