2013-10-07 120 views
5

我有一個通用的抽象模板類。我想如果我創建類型特定的生產者,我可以直接在泛型類中注入一些DAO服務。但我不能。爲什麼不能注入泛型類?

爲什麼?我怎麼能解決這個問題?

abstract class MyView<T> { 
    @Inject 
    MyDao<T> dao; 

    //some more template methods that make use of the dao 
    void someMethod() { 
     dao.use(); 
    } 
} 

class CustomerView extends MyView<Customer> { 
    //javax.enterprise.inject.AmbiguousResolutionException: Ambigious resolution 
} 


class DaoManager { 
    @Produces 
    MyDao<Customer> getDaoCustomer() { 
     return DaoFactory.make(Customer.class); 
    } 

    @Produces 
    MyDao<Product> getDaoProduct() { 
     return DaoFactory.make(Product.class); 
    } 
} 

當我注射例如@Inject MyDao<Customer> dao;它完美的作品。但不能與仿製藥......

+0

你的'DaoFactory'是如何實現的? –

+1

請定義「不起作用」。另外,'@Inject MyDao dao;'不是通用的? –

+0

不工作意味着拋出異常。當然MyDao 在一定程度上是通用的。不過我想爲抽象方法注入完全通用的doa。不是定製的。 – membersound

回答

6

當你請求

@Inject MyDao<Customer> dao; 

容器知道你要明確MyDao<Customer>類型的豆。如果這樣的bean存在並且它的類型信息已知,那麼容器可以滿足注入。例如,類型信息在您的@Produces註釋的方法保存

@Produces 
MyDao<Product> getDaoProduct() { 

容器使用反射來檢索參數類型,並且可以匹配到所請求的@Inject領域。

隨着

abstract class MyView<T> { 
    @Inject 
    MyDao<T> dao; 

然而,所有的容器都知道的是,你想要一個MyDaoT是一個類型變量,而不是具體的參數化。容器不能爲其設定特定的類型。在你的情況下,兩個@Produces豆將匹配,並會有歧義。


在你的例子中,我們從上下文知道它真的想要一個MyDao<Customer>。這似乎不是你的容器能夠做的事情,即。試圖將類型參數解析爲參數化子類的具體類型參數。

+0

@mrts我編輯了我的答案,因爲我認爲我誤解了他們的問題。但我不認爲你的評論代表他們所問的情況。他們試圖注入的字段的類型是'Foo '。容器必須將類型解析爲子類的「Customer」。它看起來不像。 –

相關問題