Donc, le groupe avec lequel je travaille a réduit la quantité de code que nous devons taper pour certaines choses. Dans ce cas, une page Web Spring affichant une liste utilisant les bibliothèques DisplayTag. La façon dont cela est fait est avec une classe utilisant des génériques qui étendent l'objet Controller
, puis une sous-classe pour chaque page sur laquelle il devrait fonctionner.Comment faire pour supprimer Type Erasure en Java
Ce contrôleur affiche SystemErrorReport
et définit le type à SystemErrorReportCommand
.
public class SystemErrorReportController extends
GenericSearchAndSelectController<SystemErrorReportCommand> {
Le problème est que SystemErrorReportCommand
, être passé comme un type, a besoin d'avoir une déclaration manuelle d'elle-même dans son constructeur, comme suit:
public SystemErrorReportCommand()
{
super(SystemErrorReport.class);
}
L'objet de commande est ensuite passé à quelque chose qui a besoin de connaître son type explicite. Sans le spécifier manuellement quelque part, il revient comme GenericCommand
, une autre classe de la nôtre, parce que le bit SystemErrorReportCommand
est perdu après la compilation.
Je ne suis pas ravi de cela, car il semble que nous puissions automatiser davantage pour réduire les erreurs de développement. Y a-t-il une manière plus élégante de faire ceci, ou suis-je coincé avec ceci à cause de l'effacement de type?
Permettez-moi de vérifier ce lundi.Nous réfléchissons déjà beaucoup, je devrais peut-être être plus précis avec ma question, mais je ne veux pas me passer de l'exemple en face de moi. –
Ok, vérifié. Le problème ici est qu'il y a quelque chose comme: classe Foo; -et- la classe Baz s'étend Bar; -et- la classe Zab s'étend Bar; Quand quelque chose appelle Foo avec Baz (sous-classe de Bar), tout ce que je peux obtenir est Bar, pas Baz; J'ai perdu la sous-classe et ne peux récupérer que le type explicite. Cela avait-il un sens? –
Oui, malheureusement, c'est le genre d'information qui est effacée. Au moment de l'exécution, il n'y a qu'une seule instance de la classe Foo (Foo.class). Donc, vous obtenez seulement le type générique "déclaré" plutôt que le type générique "instance". C'est ce sur quoi porte la discussion "reified generic" (http://gafter.blogspot.com/2006/11/reified-generics-for-java.html). Malheureusement, cela ne fera pas partie de Java 7 non plus. – vdr