我希望能够使用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说我没有执行任何约束......
非常感谢任何帮助
答案 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);
}
此时您的问题似乎与泛型无关,尽管此处还有一些其他可疑决策 与泛型有关。