gpt4 book ai didi

java - 吉斯 "Throwing Providers": How to bind to a type with generics?

转载 作者:行者123 更新时间:2023-11-30 04:37:07 25 4
gpt4 key购买 nike

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

我为提供者创建了一个接口(interface):

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

我在要注入(inject)提供程序的对象上使用 @Inject 注释:

@Inject
public SomeConstructor(IMyProvider<List<SomeType>> myProvider)
{
//...
}

现在,我的问题是:如何绑定(bind)此提供程序

由于使用了泛型,我考虑使用TypeLiteral :

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

但看起来TypeLiteral不是此 bind() 方法的有效参数。

我错过了什么吗?

更新:

我找到了解决方法。通过创建一个扩展 ArrayList<SomeType> 的类,我能够绑定(bind)提供者:

public class SomeTypeList extends ArrayList<SomeType>

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

但是如果 SomeTypeList 会更容易不需要类(class)!

最佳答案

您正在寻找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);

关于java - 吉斯 "Throwing Providers": How to bind to a type with generics?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13219610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com