TypeLiteral注射reflection

上下文:java使用guice (最新版本)

大家好,是否可以通过这种方式向Guice注入一些TypeLiteral:

public MyClass getMyClass(Injector injector, Class a, Class b) { //how to Inject MyClass with type a & b ? //eg : injector.getInstance(MyClass) } public interface MyClass { public T do(S s); } public class ClassOne implements MyClass { public Integer do(String s) { //do something } } Module : bind.(new TypeLiteral<MyClass(){}).to(ClassOne.class); bind.(new TypeLiteral<MyClass(){}).to(ClassTwo.class); ... 

处理这个问题的最佳方法是什么(使用Guice)?

谢谢 !

为您的类型创建ParameterizeType:

 // It's supposed to be internal. // You could use sun.reflect.generics.reflectiveObjects but it is not portable. // Or you can implement it yourself (see below) ParameterizedType type = new com.google.inject.internal.MoreTypes.ParameterizedTypeImpl(null, MyClass.class, a, b); 

从中创建一个TypeLiteral:

 TypeLiteral typeLiteral = TypeLiteral.get(type); 

现在创建注入实例:

 return (MyClass) injector.getInstance(Key.get(typeLiteral)) 

实际上,您希望自己实现ParameteriedType:

  final Type[] types = {a, b}; ParameterizedType type = ParameterizedType() { @Override public Type[] getActualTypeArguments() { return types; } @Override public Type getOwnerType() { return null; } @Override public Type getRawType() { return MyClass.class; }; } 

编辑:事实上,你可以使用:

 Types.newParameterizedType(MyClass.class,a,b) 

请参阅带有类型参数的Guice模块

事实上,我认为这是不可能的。 generics在运行时不具体化 。 这意味着在运行时不存在信息。 所以它并不关心你给它的通用类型。

所以,我认为不需要这种方法。 就像这样:

 public MyClass getMyClass(Injector injector, Class a, Class b) { return new MyClass(); // Or maybe something like this, if you use custom constructors // return injector.getInstance(); } 

由于MyClass是一个界面,你想要实现的是完全没用的,也是不可能的。 当您仅指定param类型和返回类型时,如何实例化具有特定行为的对象。
我认为你应该尝试找到一种不同的工作方式。