2015-04-16 77 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>(); } 
} 
相關問題