使用Guice 3.0,我尝试注入一个可以抛出特定检查异常的Provider。所以我使用Throwing Providers extension。
我为提供商创建了一个界面:
public interface IMyProvider<T> extends CheckedProvider<T>
{
@Override
T get() throws MyException;
}
及其实施:
public class MyProvider implements IMyProvider<List<SomeType>>
{
@Override
public List<SomeType> get() throws MyException
{
//...
}
}
我在要注入Provider的对象上使用@Inject注释:
@Inject
public SomeConstructor(IMyProvider<List<SomeType>> myProvider)
{
//...
}
现在,我的问题是:如何绑定此提供程序?
由于使用了泛型,我使用TypeLiteral
:
bind(MyProvider.class);
ThrowingProviderBinder.create(binder())
.bind(IMyProvider.class, new TypeLiteral<List<SomeType>>(){})
.to(MyProvider.class);
但似乎TypeLiteral
不是这个bind()方法的有效参数。
我错过了什么吗?
更新:
我找到了解决方法。通过创建扩展ArrayList<SomeType>
的类,我能够绑定Provider:
public class SomeTypeList extends ArrayList<SomeType>
和
bind(MyProvider.class);
ThrowingProviderBinder.create(binder())
.bind(IMyProvider.class, SomeTypeList.class)
.to(MyProvider.class);
但如果不需要SomeTypeList
课程会更容易!
答案 0 :(得分:2)
您正在寻找Type
实例,TypeLiteral
本身并未实施。
我没有直接使用过这个,但是Guice提供了一个Types
类,还有一个方法TypeLiteral.getType
。请尝试以下方法之一:
Types.listOf(SomeType.class)
Types.newParameterizedType(List.class, SomeType.class)
(new TypeLiteral<List<SomeType>>() {}).getType()
我的偏好是第一个,看起来像这样:
ThrowingProviderBinder
.create(binder())
.bind(IMyProvider.class, Types.listOf(SomeType.class))
.to(MyProvider.class);