1

使用 Guice 3.0,我尝试注入一个可以抛出特定检查异常的 Provider。所以我使用Throwing Providers 扩展

我为 Provider 创建了一个接口:

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)
{
    //...
}

现在,我的问题是:如何绑定这个 Provider

由于使用了泛型,我想使用TypeLiteral

bind(MyProvider.class);
ThrowingProviderBinder.create(binder())
                      .bind(IMyProvider.class, new TypeLiteral<List<SomeType>>(){})
                      .to(MyProvider.class);

但这似乎TypeLiteral不是此 bind() 方法的有效参数。

我错过了什么吗?

更新 :

我找到了解决方法。通过创建一个扩展类ArrayList<SomeType>,我可以绑定提供者:

public class SomeTypeList extends ArrayList<SomeType>

bind(MyProvider.class);
ThrowingProviderBinder.create(binder())
                      .bind(IMyProvider.class, SomeTypeList.class)
                      .to(MyProvider.class);

但是,如果SomeTypeList不需要该课程,那就更容易了!

4

1 回答 1

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);
于 2012-11-04T19:47:02.857 回答