【问题标题】:Question regarding Google Guice's TypeLiteral关于 Google Guice 的 TypeLiteral 的问题
【发布时间】:2011-09-06 02:53:37
【问题描述】:

我有几个关于使用 TypeLiteral 的问题。

首先,我了解到,只要您想将实例与通用信息绑定,就需要使用 TypeLiteral。如果你想注入 Box 你需要绑定bind(new TypeLiteral<Box<String>>(){}).to(BoxImpl.class) 所以当你遇到@Inject Box<String> 我们注入实例BoxImpl。 我的问题是:

  1. 为什么我们要在需要绑定的时候创建新的 TypeLiteral 实例? (我们通常绑定(interface.class).to(implementation.class)

  2. 绑定时创建TypeLiteral的新实例时{}的作用是什么? new TypeLiteral< Box< String > >(){}

  3. 为什么我们需要以 TypeLiteral 开头?

谢谢。

【问题讨论】:

    标签: guice


    【解决方案1】:
    1. 并非每次都必须创建一个新实例,但这样做通常比将 TypeLiteral 实例作为常量存储并使用它更方便。
    2. 您正在创建TypeLiteral<Box<String>> 的匿名子类。通过这样做,特定的泛型类型参数对于您正在创建的整个 是固定的,因此在运行时可用。
    3. 因为否则将无法区分 Box<String> 绑定和不同的 Box<Integer> 绑定。

    顺便说一句,对于您给出的示例,我认为您需要编写:

    bind(new TypeLiteral<Box<String>>(){}).to(new TypeLiteral<BoxImpl<String>>(){});
    

    (除非BoxImpl 出于某种原因实现了Box&lt;String&gt; 本身,而不是Box&lt;T&gt;。)

    【讨论】:

      猜你喜欢
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      相关资源
      最近更新 更多