为什么不能注入泛型类?

时间:2013-10-07 21:02:57

标签: java java-ee dependency-injection cdi

我有一个通用的抽象模板类。我想如果我创建特定于类型的生成器,我可以直接在泛型类中注入一些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;时,它完美无缺。但不是泛化......

1 个答案:

答案 0 :(得分:8)

当您提出要求时

@Inject MyDao<Customer> dao;

容器知道你想要一个特定类型为MyDao<Customer>的bean。如果存在这样的bean并且其类型信息是已知的,则容器可以满足注入。例如,类型信息保留在@Produces带注释的方法

@Produces
MyDao<Product> getDaoProduct() {

容器使用反射来检索参数化类型,并将其与请求的@Inject字段匹配。

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

然而,所有容器都知道你想要一个MyDaoT是一个类型变量,而不是具体的参数化。容器不能为它采用特定类型。在您的情况下,两个@Produces bean都匹配,并且会有歧义。


在您的示例中,我们从上下文中知道它确实需要MyDao<Customer>。这似乎不是你的容器能做的事情,即。尝试将类型参数解析为参数化子类的具体类型参数。