java - Guice:如何为所有类型绑定(bind)泛型?

标签 java guice

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

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

我要绑定(bind)所有 List<T>ArrayList<T> . 我知道我可以使用 TypeLiteral s 绑定(bind)显式原始类型,例如 List<String> ,但是无论如何都可以对所有类型执行此操作吗?

基本上,这段代码应该不会失败,因为我没有显式绑定(bind) List:

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

最佳答案

这在 Guice 中是不可能的。在内部 Guice 只不过是一个 HashMap<Key, Provider<?>> ,其中一个 Key表示可选的绑定(bind)注释和单个完全限定类型。要匹配类型的“模式”,需要 Key 的行为更像谓词,这需要非常不同的体系结构,并且会使绑定(bind)查找速度变慢。

此外,尽管您可能将 List 用于一个简单的示例,但请记住,Guice 绑定(bind)最好保留给可能在生产或测试中发生变化的等效实现。除了具有非常不同的特定于算法的性能特征外,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>(); }
}

关于java - Guice:如何为所有类型绑定(bind)泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29676605/

相关文章:

java for 循环与空语句

java - 为什么字段注入(inject)导致类难以测试?

java - SearchControls.setTimeLimit() 是否处理读取超时?

guice - 结合@Provides 和@Inject

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

java - 为什么我的正则表达式不匹配大写字符和下划线?

java - 如何将图像添加到 GridView 并为这些图像添加点击功能?

java - 根据参数重用Guice中的Provide

java - 使用 google guice 的 mvp 场景实际上涉及什么?

dependency-injection - 何时提供显式绑定(bind)以及何时利用 Guice 上的自动绑定(bind)