为什么不能注入泛型类?

mem*_*und 10 java dependency-injection java-ee 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我注射例如@Inject MyDao<Customer> dao;它它完美地工作.但不是泛型......

Sot*_*lis 9

当你要求

@Inject MyDao<Customer> dao;
Run Code Online (Sandbox Code Playgroud)

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

@Produces
MyDao<Product> getDaoProduct() {
Run Code Online (Sandbox Code Playgroud)

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

abstract class MyView<T> {
    @Inject
    MyDao<T> dao;
Run Code Online (Sandbox Code Playgroud)

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


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