2015-04-16 34 views
6

假设我有以下模式在我的代码往往重复:Guice:我如何为所有类型绑定泛型?

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

我要绑定所有List<T>ArrayList<T>。 我知道我可以使用TypeLiteral s来绑定一个明确的原始类型,例如,List<String>,但无论如何要为所有类型执行此操作吗?

基本上,这个代码不应该失败,因为我没有绑定列表中明确:

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

。这不可能。 –

+1

这种“通配符”绑定的一些讨论可以在这里找到:https://github.com/google/guice/issues/852 –

回答

3

这是不可能的吉斯。内部Guice只是一个HashMap<Key, Provider<?>>,其中Key表示一个可选的绑定注释和一个完全限定的类型。为了匹配类型的“模式”,需要Key的行为更像是一个谓词,这需要一个非常不同的体系结构,这会使绑定查找速度变慢。此外,虽然您可能使用List作为一个简单示例,但请记住,Guice绑定更适合于在生产或测试中可能有所不同的等效实现。除了具有非常不同的算法特定性能特征之外,列表实现在处理null项目的能力方面也有所不同,一旦您选择了给定算法的理想列表实现,则不太可能需要对其进行更改 - 特别是在应用程序范围的配置。

如果你想能够与吉斯风格的配置改变你的通用实现,创建一个非常小的工厂像ListFactory:基于我发现到目前为止已经试过

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