2009-11-30 56 views
4

泛型类型的如何使用Spring配置创建使用Spring配置

public class GenericService<T> 
{ 
... 
} 

注意,T不是具体类型Bean属性的我实例化一个bean与泛型类型。它实际上只是这种服务的一种方法。

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

我的泛型类包含

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

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

回答

10

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

+0

嗨博兹霍 我只是在这里学习。我可以使用spring上下文实例化 新的GenericService ()或新的GenericService ()。 我的通用类包含 公共列表 performTheService(字符串字,类 clazz所) { 尝试{ 返回clazz.newInstance()getAllWords(); .... 泛型方法的返回类型取决于实例化类的具体参数类型。 这是可能的或DI +泛型的错误用法? TIA – Shreeni 2009-11-30 09:13:58

+1

您可以安全地在泛型中使用DI,因为正如我所说的,泛型在注入依赖关系时会丢失。 – Bozho 2009-11-30 09:37:29

+0

谢谢,澄清。 我确实看到我可以在运行时使用反射来访问泛型类型信息。但它看起来太复杂了,而且绝对不是用于向具体类型注入bean – Shreeni 2009-11-30 10:01:22

1

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

3

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

泛型是编译时的概念...

事实是,不(完全)消除在编译时的通用信息。你仍然可以通过反射来获取这些信息,这就是Spring DI容器已经用于集合的东西。见3.3.3.4.2。 2.0.8 Spring文档中的强类型集合(仅适用于Java 5+)(对不起,只能发布一个超链接)。

但是,我还不知道(还)是否有可能指示容器为您的自定义类也这样做。

如果你想知道如何检索在运行时该信息,这里是从尼尔Gafter原帖:http://gafter.blogspot.com/2006/12/super-type-tokens.html

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

} 

凡commentservice看起来像你想象:

@Service 
public class CommentService<T> { 
相关问题