2009-11-30 5 views
4

Comment puis-je instancier un haricot de type générique en utilisant config Springde type générique avec Spring Config

public class GenericService<T> 
{ 
... 
} 

Notez que T est pas le type de béton d'une propriété de haricot. C'est vraiment juste le type pour l'une des méthodes du service.

En d'autres termes .. Puis-je instancier nouvelle GenericService de type String ou une nouvelle GenericService de type Long en utilisant le contexte de printemps.

Ma classe générique contient

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

Le type de retour de la méthode générique dépend du type de paramètre concret de la classe instanciée. Est-ce une utilisation possible ou incorrecte des génériques DI +? TIA

Répondre

10

Les génériques sont un concept à la compilation, alors que le contexte à ressort est chargé au moment de l'exécution, donc ils ne se croisent pas. Qu'essayez-vous exactement d'accomplir? Quelle est votre utilisation.

+0

Salut Bozho Je suis en train d'apprendre ici. Puis-je instancier nouveau GenericService () ou nouveau GenericService () en utilisant le contexte de printemps. Ma classe générique contient publics Liste performTheService (mot cordes, classe clazz) {{ essayer GETALLWORDS clazz.newInstance() de retour(). .... Le type de retour de la méthode générique dépend du type de paramètre concret de la classe instanciée. Est-ce une utilisation possible ou incorrecte des génériques DI +? TIA – Shreeni

+1

Vous pouvez utiliser DI en toute sécurité avec des génériques, car comme je l'ai dit, les génériques sont perdus au moment où les dépendances sont injectées. – Bozho

+0

Merci, Cela clarifie. J'ai vu que je pouvais accéder à des informations de type générique à l'exécution en utilisant la réflexion. Mais il semble beaucoup trop complexe et n'est certainement pas conçu pour injecter des haricots avec des types de béton – Shreeni

1

Vous devriez juste l'instancier en utilisant le nom de la classe brute. Comme le dit @Bozho, les génériques sont une construction uniquement à la compilation et leurs types complets ne sont pas disponibles au moment de l'exécution.

3

Vous pouvez utiliser DI en toute sécurité avec des génériques, car comme je l'ai dit, les génériques sont perdus au moment où les dépendances sont injectées.

Generics sont un concept de compilation ...

La vérité est, l'information générique n'est pas (complètement) effacé au moment de la compilation. Vous pouvez toujours récupérer ces informations par réflexion, et c'est ce que le conteneur Spring DI fait déjà pour les collections. Voir 3.3.3.4.2. Collection fortement typée (Java 5+ seulement) dans la documentation 2.0.8 Spring (désolé peut seulement poster un lien hypertexte).

Cependant, je ne sais pas (encore) s'il est possible d'ordonner au conteneur de le faire pour vos classes personnalisées.

Si vous voulez savoir comment récupérer ces informations lors de l'exécution, voici le message original de Neal Gafter: http://gafter.blogspot.com/2006/12/super-type-tokens.html

0

Aucune des réponses montre des exemples, il est facile:

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

} 

Où commentservice ressemble à ce que vous imaginez:

@Service 
public class CommentService<T> { 
Questions connexes