当前位置: 首页 > 知识库问答 >
问题:

Guice“抛出提供者”:如何用泛型绑定到类型?

夹谷和韵
2023-03-14

使用Guice 3.0,我尝试注入一个提供程序,该提供程序可以抛出特定的已检查异常。所以我使用了抛出提供者扩展。

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

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
public SomeConstructor(IMyProvider<List<SomeType>> myProvider)
{
    //...
}

现在,我的问题是:如何绑定这个提供者?

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

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

但是对于这个bind()方法来说,TypeLiteral似乎不是有效的参数。

我错过了什么吗?

更新:

我找到了一个解决办法。通过创建扩展ArrayList的类

public class SomeTypeList extends ArrayList<SomeType>

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

但是,如果不需要这个类,那么就更容易了!


共有1个答案

谢俊力
2023-03-14

您正在寻找一个Type实例,TypeLitald不会本机实现该实例。

我没有直接使用它,但Guice确实提供了一个类型类,还有一个方法TypeLiteral。getType。请尝试以下操作之一:

  • Types.list(某些ype.class)
  • Types.new参数化类型(List.class,某些ype.class)
  • (新TypeLitald

我的偏好是第一个,看起来像这样:

ThrowingProviderBinder
    .create(binder())
    .bind(IMyProvider.class, Types.listOf(SomeType.class))
    .to(MyProvider.class);

 类似资料:
  • 可以自动绑定泛型类吗?考虑一下: 通用接口: 长子类型: 字符串子类型: 自定义模块:公共类CustomModule扩展AbstractModule{ } 主要的 是否可以以某种方式(例如:基抽象类、反射或其他)自动绑定

  • 我正在开发一个基于JAX-RS的Java应用程序,使用Google Guice进行依赖注入。我的代码中有以下接口: 在上面的接口中,Lock是一个定义如下的接口: 锁接口由以下类实现: LockProvider接口由以下类实现: 除了LockProvider之外,我不希望应用程序中的类知道底层锁项,这就是为什么我没有在lock接口中包含getUnderlyingLockItem。 现在,当我尝试将

  • 我正在尝试用Guice注入泛型类型。我有存储库 所以当我创建光标时

  • 问题内容: 是否有将通用类型参数约束为 任何 类型范围的语法或解决方法? 我知道您可以将一个类型限制为 所有 类型的范围(即逻辑): 是否有逻辑版本,例如: 如果没有支持该语法的语法(我认为不存在),是否有一种好的方法或方法? 在某些情况下,一个示例用例可能是: 人们似乎迷上了上面我的方法示例的确切语义。让我们尝试一下: 编辑: 我不会在编译时知道(可能来自外部代码),所以我想避免每种类型都有具体

  • 我最近开始使用Google Guice,通过我在网络上找到的教程和代码工作,但现在我被困住了。 我已经尝试创建了一个,我可以在每个实体DAO的基础上扩展该。我很难弄清楚如何配置一个现有的私有Guice模块。 这里是我的,其中是一个使用作为标识的实体。类是另一个不依赖于的实体(目前,我正在尝试让它一开始就简单)。 当尝试运行以下内容时,我会得到: Google Guice用户指南在这里没有真正帮助我

  • 问题内容: 我有这个课: 其中,和是具体的类。现在,如果我想为这种情况实现一个模块,我会这样做: 但是我想知道这是否是绑定具体类的正确方法,还是有更简单的方法。我觉得有一个更简单的方法。 编辑 只是尝试了一下,它似乎不起作用: 编辑2 似乎根本不需要绑定: 似乎也可以。 问题答案: Guice的即时绑定正是您想要的。根据您的,并满足以下要求(从Guice 文档中引用): 公共的,无参数的构造函数或