我有一个通用的抽象模板类。我以为如果创建特定于类型的生产者,则可以直接在通用类中注入一些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;
它完美地工作。但是没有泛型...
当您要求
@Inject MyDao<Customer> dao;
容器知道您要一个类型为的bean MyDao<Customer>
。如果存在这样的bean并且其类型信息已知,则容器可以满足注入。例如,类型信息保留在带@Produces
注释的方法中
@Produces
MyDao<Product> getDaoProduct() {
容器使用反射来检索该参数化类型,并将其与请求的@Inject
字段匹配。
用
abstract class MyView<T> {
@Inject
MyDao<T> dao;
但是,容器只知道您需要一个MyDao
。T
是类型变量,而不是具体的参数化。容器不能为其指定特定类型。在您的情况下,两个@Produces
bean都将匹配并且存在歧义。
在您的示例中,我们从上下文中知道它确实需要一个MyDao<Customer>
。这似乎不是您的容器能够执行的操作,即。尝试将类型参数解析为参数化子类的具体类型参数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句