Guice“Throwing Providers”:如何绑定到泛型的类型?

时间:2012-11-04 14:54:57

标签: java guice guice-3

使用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课程会更容易!

1 个答案:

答案 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);