Guice:如何为所有类型绑定泛型?

时间:2015-04-16 13:42:57

标签: java guice

假设我的代码中经常重复以下模式:

class A<T> {
    @Inject
    public A(List<T> list) {
        // code
    }
}

我想将所有 List<T>绑定到ArrayList<T>。 我知道我可以使用TypeLiteral来绑定显式的原始类型,例如List<String>,但无论如何都要为所有类型执行此操作?

基本上,这段代码不应该失败,因为我没有明确地绑定List:

injector.getInstance(new Key<A<Integer>>(){});

1 个答案:

答案 0 :(得分:3)

这在Guice中是不可能的。内部Guice只是HashMap<Key, Provider<?>>,其中Key表示可选的绑定注释和单个完全限定类型。匹配&#34;模式&#34;类型需要Key表现得更像谓词,这需要一个非常不同的架构,这会使绑定查找更慢。

此外,虽然您可能正在使用List作为一个简单示例,但请记住,Guice绑定最好保留用于可能在生产或测试中变化的等效实现。除了具有非常不同的特定于算法的性能特征之外,List实现在处理null项目的能力方面也各不相同,并且一旦您为给定算法选择了理想的列表实现,您就不太可能需要改变它 - 特别是在应用程序范围的配置中。

如果您希望能够使用Guice风格的配置改变通用实现,请创建一个非常小的工厂,如ListFactory

public class ListFactory {
  public <T> List<T> createFooBarList() { return new ArrayList<T>(); }
  public <T> List<T> createSomeOtherList() { return new LinkedList<T>(); }
}