Guice 绑定泛型类型
Guice Bind Generic Types
有没有办法绑定下一类泛型类型:
public interface A<T extends Number> {
void print(T t);
}
public class B implements A<Integer> {
@Override
public void print(Integer i) {
System.out.println(i);
}
}
public class C implements A<Double> {
@Override
public void print(Double d) {
System.out.println(d);
}
}
我如何准确地绑定上述接口及其实现(使用 TypeLiteral
?)以便我可以根据某些条件创建类型化实例?
class Main {
public static void main(String[] args) {
A a1 = Guice.createInjector(new MyModule()).getInstance( ??? );
a1.print(1); //will print 1
A a2 = Guice.createInjector(new MyModule()).getInstance( ??? );
a2.print(1.0); //will print 1.0
}
}
MyModule
应该是什么样子?
你缺少的是,
Injector injector = Guice.createInjector(new MyModule());
A a1 = injector.getInstance(Key.get(new TypeLiteral<A<Integer>>() {}));
还有你的 MyModule
public static class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(new TypeLiteral<A<Integer>>() {}).toInstance(new B());
}
}
您可以创建提供程序方法,而不必在定义中使用 TypeLiteral<A<Integer>>
。
class MyModule extends AbstractModule {
@Provides
@Singleton
A<Integer> provideAOfInteger() {
return new B();
}
}
您还可以使用隐式绑定来访问您的 A<Integer>
:
class AOfIntegerHolder {
@Inject A<Integer> aOfInteger;
}
Injector injector = Guice.createInjector(new MyModule());
A<Integer> a1 = injector.getInstance(AOfIntegerHolder.class).aOfInteger;
Guice 的美妙之处在于,通常有多种方法可以做您想做的事,而且 none 优于其他方法:它们只是不同 ;)
有没有办法绑定下一类泛型类型:
public interface A<T extends Number> {
void print(T t);
}
public class B implements A<Integer> {
@Override
public void print(Integer i) {
System.out.println(i);
}
}
public class C implements A<Double> {
@Override
public void print(Double d) {
System.out.println(d);
}
}
我如何准确地绑定上述接口及其实现(使用 TypeLiteral
?)以便我可以根据某些条件创建类型化实例?
class Main {
public static void main(String[] args) {
A a1 = Guice.createInjector(new MyModule()).getInstance( ??? );
a1.print(1); //will print 1
A a2 = Guice.createInjector(new MyModule()).getInstance( ??? );
a2.print(1.0); //will print 1.0
}
}
MyModule
应该是什么样子?
你缺少的是,
Injector injector = Guice.createInjector(new MyModule());
A a1 = injector.getInstance(Key.get(new TypeLiteral<A<Integer>>() {}));
还有你的 MyModule
public static class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(new TypeLiteral<A<Integer>>() {}).toInstance(new B());
}
}
您可以创建提供程序方法,而不必在定义中使用 TypeLiteral<A<Integer>>
。
class MyModule extends AbstractModule {
@Provides
@Singleton
A<Integer> provideAOfInteger() {
return new B();
}
}
您还可以使用隐式绑定来访问您的 A<Integer>
:
class AOfIntegerHolder {
@Inject A<Integer> aOfInteger;
}
Injector injector = Guice.createInjector(new MyModule());
A<Integer> a1 = injector.getInstance(AOfIntegerHolder.class).aOfInteger;
Guice 的美妙之处在于,通常有多种方法可以做您想做的事,而且 none 优于其他方法:它们只是不同 ;)