2009-11-30 85 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> { 
相關問題