如何使用Spring config
实例化具有泛型类型的beanpublic 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
答案 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> {