当前位置: 首页 > 面试题库 >

为什么不可能注入泛型类?

宋飞舟
2023-03-14
问题内容

我有一个通用的抽象模板类。我以为如果创建特定于类型的生产者,则可以直接在通用类中注入一些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;

但是,容器只知道您需要一个MyDaoT是类型变量,而不是具体的参数化。容器不能为其指定特定类型。在您的情况下,两个@Producesbean都将匹配并且存在歧义。

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



 类似资料:
  • 问题内容: 我正在使用泛型编写某些东西,令我惊讶的是,我发现这行不通: 那我不能实例化泛型吗?没有任何方法可以做到这一点吗? 问题答案: 是的,这真是令人讨厌。 我使用的解决方法是强制客户端在构造新类时传递类-即 然后您可以使用。

  • 问题内容: 我正在尝试使用泛型实现以下结构。收到编译器错误,无法找出原因。 这个想法是译者使用T作为字典中键的类型。例如,可以是字符串或枚举。子类提供具体的字典。 但是它失败,因为:“类型’String’不符合协议’Hashable’” 但是String符合Hashable。它也不适用于Int,后者也符合Hashable。 如果删除类型约束,则仅用于测试(在此我还必须禁用字典,因为我不能在其中使用

  • 在研究泛型时,我注意到泛型方法和泛型类型(类或接口)在类型引入语法上的一个差异使我感到困惑。 泛型方法的语法为 文件上说 为了彼此保持一致,我希望方法语法为 ,或者类型语法(for class)为,但事实显然并非如此。 为什么一个要介绍在前,另一个要介绍在后? 我主要以的形式使用泛型,并认为可能看起来很奇怪,但这是一个主观的参数,此外对于方法也是这样。您可以调用,类似于 在寻找技术解释时,我想在指

  • 定义参数化类时,只能使用固定数量的参数。 但是,如果你想创建一个包含多个值的地图。必须使用映射

  • 我正在尝试用Guice注入泛型类型。我有存储库 所以当我创建光标时

  • 我在这个论坛上读到了很多关于尝试Autowire pojo时发生的类似问题的文章,通常修复的答案与或/有关。但是,在我的例子中,我设法autowire我的pojo(Mas60010),但我不能autowire或以及可能来自我没有编写代码的包的任何其他对象。 为了简单起见,我只提到。我做错了什么?我想问题要么出在库上,要么出在配置上。注意:请不要仅仅通过显示一个与他自己的POJO相关的问题来指出这个