使用Spring Config创建泛型类型

时间:2009-11-30 08:04:03

标签: java spring dependency-injection

如何使用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

4 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:3)

  

你可以安全地将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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

没有一个答案显示任何例子,很容易:

@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);

}

评论服务看起来像你想象的那样:

@Service
public class CommentService<T> {