如何使用 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);
}
你的问题目前似乎与泛型无关,尽管这里做出的其他一些有问题的决定与泛型有关。
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);
}
你的问题目前似乎与泛型无关,尽管这里做出的其他一些有问题的决定与泛型有关。