【问题标题】:Creation of generic type using Spring Config使用 Spring Config 创建泛型类型
【发布时间】:2026-01-14 05:25:01
【问题描述】:

如何使用 Spring config 实例化具有泛型类型的 bean

public class GenericService<T> 
{
 ...
}

请注意,T 不是 bean 属性的具体类型。它实际上只是服务方法之一的类型。

换句话说.. 我可以使用 Spring 上下文实例化 String 类型的新 GenericService 或 Long 类型的新 GenericService。

我的泛型类包含

public <T extends WordplayService> List<S> performTheService(String word, Class<T> clazz) 
{ 
    return clazz.newInstance().getAllWords(); 
    ...
}

泛型方法的返回类型取决于实例化类的具体参数类型。 这是可能的还是错误使用 DI + 泛型? TIA

【问题讨论】:

    标签: java spring dependency-injection


    【解决方案1】:

    泛型是一个编译时的概念,而 spring 上下文是在运行时加载的,所以它们不会相交。你到底想达到什么目的?你的用例是什么。

    【讨论】:

    • 嗨 Bozho 我只是在这里学习。我可以使用 spring 上下文实例化 new GenericService() 或 new GenericService() 吗?我的通用类包含 public List performTheService(String word, Class clazz) { try { return clazz.newInstance().getAllWords(); .... 泛型方法的返回类型取决于实例化类的具体参数类型。这是可能的还是错误使用 DI + 泛型? TIA
    • 您可以安全地使用 DI 和泛型,因为正如我所说,泛型在注入依赖项时会丢失。
    • 谢谢,这澄清了。我确实看到我可以在运行时使用反射访问泛型类型信息。但这似乎太复杂了,而且绝对不是为注入具有具体类型的 bean 而设计的
    【解决方案2】:

    您可以安全地将 DI 与泛型一起使用,因为正如我所说,泛型在注入依赖项时会丢失。

    泛型是一个编译时概念...

    事实是,通用信息在编译时不会(完全)擦除。您仍然可以通过反射检索此信息,这就是 Spring DI 容器已经为集合所做的事情。见 3.3.3.4.2。 2.0.8 Spring 文档中的强类型集合(仅限 Java 5+)(抱歉只能发布一个超链接)。

    但是,我不知道(目前)是否可以指示容器也为您的自定义类执行此操作。

    如果您想知道如何在运行时检索此信息,这里是来自 Neal Gafter 的原始帖子:http://gafter.blogspot.com/2006/12/super-type-tokens.html

    【讨论】:

      【解决方案3】:

      您应该只使用原始类名来实例化它。正如@Bozho 所说,泛型只是编译时的构造,它们的完整类型在运行时不可用。

      【讨论】:

        【解决方案4】:

        没有一个答案显示任何示例,很简单:

        @Resource
        private CommentService<String> stringCommentService;
        
        @Resource
        private CommentService<Integer> integerCommentService;
        
        @Test
        public void genericTest(){
            System.out.println("Generic test .... :");
            stringCommentService.printType("test");
        
            System.out.println("INT Generic test .... :");
            integerCommentService.printType(9);
        
        }
        

        cmetservice 看起来像您想象的那样:

        @Service
        public class CommentService<T> {
        

        【讨论】: