L'utilisation de TypeLiteral en java
Veuillez fournir des informations de base de la façon dont TypeLiteral
dans Google Guice ou Java EE est utilisé, Il sera très utile si il sera expliqué à l'aide d'un simple code, merci d'avance
TypeLiteral fait partie de Google Guice cadre, pas le Java API standard. J'ai édité votre question afin de refléter cela.
Regardez ici.
Ah, ne pense pas de la vérification de la Java EE bibliothèque directement, et le Guice classe a été le premier touché sur Google. Fait intéressant, les deux classes ont exactement le même but.
Regardez ici.
Ah, ne pense pas de la vérification de la Java EE bibliothèque directement, et le Guice classe a été le premier touché sur Google. Fait intéressant, les deux classes ont exactement le même but.
OriginalL'auteur user1119283 | 2011-12-28
Vous devez vous connecter pour publier un commentaire.
Le but de
TypeLiteral
dans Guice est de vous permettre de lier les classes et les instances de types génériques (avec des paramètres de type spécifié) pour éviter les problèmes découlant du fait que les génériques ne sont pas réifiée en Java, c'est à dire le fait que l'effacement se cache la différence entreSomeInterface<String>
etSomeInterface<Integer>
au moment de l'exécution.TypeLiteral
permet à la valeur d'un paramètre générique survivre à l'effacement par la création d'un ad hoc sous-classe du type générique.Exemple d'utilisation de
TypeLiteral
:Cette lie un paramètre de type
SomeInterface<String>
àSomeImplementation
classe.De fond, informations, jetez un oeil à ce blog sur les super-type de jetons et puis celui-ci sur le type de littéraux.
OriginalL'auteur Adam Zalcman
Comme si quelque chose en Guice - modularité, réutilisabilité, et la suppression de passe-partout sont les concepts de base de tous les services publics.
Bien sûr, tout ce que vous faites dans Guice peut être imité dans Java, au prix de beaucoup de passe-partout Donc... la vraie question est :
Comment pouvons-nous UTILISER TypeLiterals à écrire plus modulaire/composants réutilisables ?
La puissance de TypeLiterals dans Guice est qu'il vous permet de refernce implémentations d'un service sans définir ce que le service est.
Permet de commencer avec une liste simple dans un programme où nous avons de nombreux types de listes qui sont traitées differntly :
Maintenant, comment dois-je traiter ces Chaînes ? Au moment de l'exécution, il n'y a aucun moyen de "savoir" que ses une liste de chaînes. Donc, souvent, je pourrais créer une usine, comme ça , qui obtient le traitement des objets pour moi :
Ainsi, je pourrais utiliser une usine (avec un tas de if/else ou de l'affaire états) pour définir les processeurs pour différents types de données. Mon constructeur, pour l'objet qui utilise ces processeurs, et qui a besoin d'accéder à divers Processeur Implémentations, pourrait ressembler à ceci :
Tout bon pour l'instant... Jusqu'à ce que nous nous rendons compte qu'il ya une meilleure façon :
Dans le Guice monde, je ne peux pas oublier à propos de l'écriture de cette usine plutôt, je peux LIER explicitement les classes de processeurs. L'avantage de cela est qu'il n'y a pas statique dépendances - classe qui a besoin d'UTILISER le processeur implémentations N'a PAS besoin de l'électricité statique de la dépendance à l'usine plutôt, les classes sont injectés directement. Ainsi, je peux facilement définir une classe qui utilise des dépendances complexes, sans avoir à construire une usine de conscience de classe builder... Donc, j'ai beaucoup moins passe-partout :
Il y a un bon tutoriel sur ce avec des implémentations d'interface et de liaison des exemples, ici : http://thejavablog.wordpress.com/2008/11/17/how-to-inject-a-generic-interface-using-guice/
OriginalL'auteur jayunit100
C'est une façon comment les gars de contournement des génériques de l'effacement en java. Vous en avez besoin, quand vous voulez ot lier certains de la mise en œuvre de paramétrées(générique) de l'interface. Trouvé un certain usage de Guice docs:
Ce certes étrange construction est le moyen de lier un type paramétré. Il raconte Guice comment à l'honneur une injection de demande pour un élément de type PaymentService. La classe CreditCardPaymentService doit mettre en œuvre les PaymentService interface. Guice ne peut actuellement pas se lier ou injecter un type générique, telle que Définie; tous les paramètres de type doivent être parfaitement définies.
OriginalL'auteur korifey
La
TypeLiteral
classe est une solution de contournement pour le fait que vous ne pouvez pas avoir de la classe des littéraux pour les types génériques. Le API doc deClasseur
(ce qui est de Google Guice, mais le Java EE de la classe du même nom, a exactement le même but) donne un exemple de la façon dont il est utilisé:Cette spécifie que tous les auto-injecté de référence de type
PaymentService<CreditCard>
sera mis en œuvre par la classe de bétonCreditCardPaymentService
, en laissant la possibilité pourPaymentService<Coupon>
à être mis en œuvre par un différents classe. SansTypeLiteral
, ce ne serait pas possible parce que le compilateur Java acceptePaymentService<CreditCard>.class
, seulementPaymentService.class
.Noter que cela nécessite également l'utilisation de l'anonymat de la sous-classes (les
{}
aprèsnew TypeLiteral<PaymentService<CreditCard>>()
) afin de contourner le type d'effacement.OriginalL'auteur Michael Borgwardt