【问题标题】:Why is it impossible to inject generic classes? [closed]为什么不能注入泛型类? [关闭]
【发布时间】:2013-10-14 14:39:06
【问题描述】:

我有一个通用的抽象模板类。我想如果我创建特定类型的生产者,我可以直接在泛型类中注入一些 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&lt;Customer&gt; dao; 时,它可以完美运行。但不是泛型...

【问题讨论】:

  • 你的DaoFactory是如何实现的?
  • 请定义“不起作用”。还有,@Inject MyDao&lt;Customer&gt; dao; 怎么不通用?
  • 不工作意味着抛出异常。当然 MyDao 在一定程度上是通用的。我仍然想为抽象方法注入一个完全通用的 doa。不是定制的。
  • Dao 就我而言,因为我使用 Vaadin,有点像:JPAContainerFactory.make(class)
  • 您收到什么错误信息?

标签: java jakarta-ee dependency-injection cdi


【解决方案1】:

当您请求时

@Inject MyDao<Customer> dao;

容器知道您需要一个特定类型为MyDao&lt;Customer&gt; 的bean。如果存在这样的 bean 并且其类型信息已知,则容器可以满足注入。例如,类型信息保存在您的 @Produces 注释方法中

@Produces
MyDao<Product> getDaoProduct() {

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

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

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-10
    • 2019-06-24
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多