2011-01-07 2 views
5

J'ai passé beaucoup de temps avec Google pour trouver des informations sur ce sujet, mais les résultats concernant les enums Java et les types de retour covariant étaient pratiquement inexistants.Les types de retour covariant Java ne fonctionnent pas pour les méthodes de substitution d'une instance enum?

donc: est-il possible d'utiliser des types de retour covariants avec des méthodes de ENUM où vous définissez une méthode dans la classe ENUM, puis le remplacer dans les instances, comme ceci:

package enumcovariance.test; 

public enum CovariantEnum { 

    INT_INSTANCE(new Integer(3)) { 
     @Override 
     public Integer getData() { 
      return (Integer) super.getData(); 
     } 
    }, 

    STR_INSTANCE("Hello world") { 
     @Override 
     public String getData() { 
      return (String) super.getData(); 
     } 
    }; 

    private final Object data; 

    private CovariantEnum(Object data) { 
     this.data = data; 
    } 

    public Object getData() { 
     return data; 
    } 

} 

Et puis pour tirer parti de la covariance comme ceci:

package enumcovariance.test; 

import org.junit.Test; 


public class CovariantEnumTest { 

    @Test 
    public void intEnumTest() { 
     Integer i = CovariantEnum.INT_INSTANCE.getData(); 
    } 

    @Test 
    public void strEnumTest() { 
     String s = CovariantEnum.STR_INSTANCE.getData(); 
    } 

} 

Dans ce cas, le compilateur est très bien avec ma définition de ENUM, mais le cas de test ne parvient pas à compiler, en disant objet ne peut pas être converti en entier (ou chaîne). Apparemment, le compilateur ne regarde que la définition de base de la méthode, pas la méthode de remplacement. Avec une définition enum différente, j'avais la méthode de base abstraite, mais cela ne fonctionnait toujours pas.

Je pense que c'est quelque chose de complexe à faire avec la façon dont les enums sont transformés pendant le processus de compilation qui l'empêche de fonctionner, mais je veux être sûr que ce n'est pas juste moi qui fais quelque chose. Notez que ce cas de test est certes très sollicité, dans mon énumération actuelle, cette fonctionnalité serait plus utile. Je peux l'afficher si nécessaire.

Répondre

2

Le type de CovariantEnum.INT_INSTANCE est CovariantEnum qui renvoie Object de getData.

Malheureusement, vous ne pouvez pas non plus utiliser le type enum.

+0

Je vois, merci pour la réponse. J'espérais que le type serait la sous-classe réelle, mais je suppose que c'est juste une limitation due à la façon dont les enums sont implémentés en Java. –

Questions connexes