2008-12-11 8 views
2

Si j'ai une classe de base telle queEst-il possible d'écrire une méthode qui retourne un objet de classe de T?

public abstract class XMLSubscription <T extends XMLMessage> 

Est-il possible d'écrire une méthode dans XMLSubscription qui retourne un objet de classe de T?

La seule solution possible que je suis venu avec est d'avoir chaque descendant de XMLSubscription ont une méthode comme:

public class XMLStatusSubscription extends XMLSubscription<XMLStatusMessage> 
{ 
    public Class <XMLStatusMessage> getExpectedMessageType() 
    {   
    return XMLStatusMessage.class; 
    } 
} 
+0

Pouvez-vous modifier le titre de votre question pour mieux refléter votre question générique? Comme, pouvez-vous spécifier un type générique qui étend une classe, ou ... quelque chose de similaire? Quelqu'un cherchant quelque chose de similaire ne va pas être aidé par le titre de votre question. – mmcdole

+0

Peut-être "Puis-je retourner le type de classe d'un générique Java?" –

+0

Bonnes suggestions, je ne pouvais pas penser à la façon de formuler la question, Merci! – darrickc

Répondre

4

Malheureusement - et oui, cela est dû au type effacement - il n'y a pas moyen de revenir l'objet Class sans le fournir à l'exécution en quelque sorte.

Heureusement, ce n'est généralement pas trop difficile. Voici comment je l'ai fait généralement ce/vu faire:

public abstract class XMLSubscription <T extends XMLMessage> { 
    private Class<T> messageType; 

    protected XMLSubscription(Class<T> messageType) { 
     this.messageType = messageType; 
    } 

    public Class<T> getExpectedMessageType() { 
     return this.messageType; 
    } 
} 

public class XMLStatusSubscription extends XMLSubscription<XMLStatusMessage> { 

    public XMLStatusSubscription() { 
     super(XMLStatusMessage.class); 
    } 
} 
+0

Fantastique! Votre solution me sauve un peu de code, et beaucoup de documentation/explication! Beau travail autour! – darrickc

0

Comme vous l'aurez deviné, T est effacé par le compilateur. Lorsque vous instanciez l'objet, il n'a aucune idée qu'il est censé traiter XMLStatusMessage objets. Votre classe de base définirait la méthode de modèle suivant, et les types de retour covariants de 1,5 garderait le compilateur heureux avec les sous-classes concrètes:

public Class<T> getExpectedMessageType() 

Il y a une méta-commentaire: cela ressemble beaucoup à code de procédure, où Quelque chose appelle getExpectedMessageType() puis prend une action en fonction du type de retour. Cela pourrait être mieux implémenté en utilisant un modèle Visitor, avec le visiteur implémentant des méthodes "doSomething" pour chacune des sous-classes de XMLMessage.

+0

Pour encadrer la question, j'ai dû découper beaucoup de code et déplacer des choses. Le code actuel met en œuvre un modèle de visiteur comme vous le recommandez. Le type est en train d'être passé dans une méthode Castor pour qu'il sache comment se marier à un objet Java. – darrickc

Questions connexes