Question

Je veux passer une valeur ENUM à la méthode dans la classe d'utilité et d'obtenir une autre valeur enum du même type enum. Quelque chose comme ceci:

public class XMLUtils {

    public static Enum<?> getEnumAttribute(Element element, String name, 
            Enum<?> defaultValue) {

        if (element.hasAttribute(name)) {
            String valueName = element.getAttribute(name);
            // search for value 
            for (Enum<?> value: defaultValue.getClass().getEnumConstants())
                if (value.toString().equalsIgnoreCase(valueName))
                    return value;
        }
        // not found, return default value
        return defaultValue;
    } 
}

Utilisation de la méthode getEnumAttribute():

// simple enum
public enum EUploadMethod {
    INSERT, UPDATE, DELETE
}

// read enum value from XML config file
EUploadMethod method = XMLUtils.getEnumAttribute(element, "method",
        EUploadMethod.INSERT);

Ce code est entièrement fonctionnel, Eclipse compile et fonctionne sans avertissements ou des erreurs et cela fonctionne comme un charme.

Mais quand je nettoie et compilent projet de ligne de commande par Maven2, il échoue avec l'erreur sur la ligne où est getEnumAttribute appelé:

$ mvn clean compile
....
[ERROR] /home/.... DataUploader.java:[173,53] inconvertible types
found   : java.lang.Enum<capture#414 of ?>
required: .....DataUploader.EUploadMethod

J'utilise Sun JDK 1.6 dans les deux Eclipse et Maven:

$ mvn -version
Apache Maven 2.2.1 (r801777; 2009-08-06 21:16:01+0200)
Java version: 1.6.0_14
Java home: /usr/lib/jvm/java-6-sun-1.6.0.14/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux" version: "2.6.27-17-generic" arch: "i386" Family: "unix"

Questions:

  1. Pourquoi ce code est compilable et fonctionnelle dans Eclipse , et compiler échoue dans Maven qui en utilisant autant que je sache même compilateur javac?

  2. Qu'est-ce qui ne va pas avec le passage énumérations spécifiques aux paramètres de Enum<?> génériques?

Merci,

Martin Schayna

Était-ce utile?

La solution

  1. compilateur Eclipse et javac ont quelques différences, notamment en ce qui concerne les médicaments génériques. On croit que l'éclipse est correcte, mais cela n'a pas d'importance:)

  2. Essayez

    public static <T extends Enum<T>> Enum<T> getEnumAttribute(Element element, String name, 
        Enum<T> defaultValue) {
       ...
    }
    

Autres conseils

Je ne sais pas quelle version d'Eclipse vous utilisez, mais je pense qu'il est faux ici. Ma version rapporte la même erreur que vous voyez avec Maven, qui semble être une véritable erreur.

Le problème est que vous avez deux jokers ("?") dans la signature de getEnumAttribute() mais il n'y a pas de contrainte (ni est-il possible de créer un) qui les oblige à être les mêmes. Ainsi, un client peut passer dans un ENUM d'un type comme la valeur par défaut et obtenir un ENUM d'un type différent en retour.

Vous pouvez éliminer l'erreur dans le code d'appel en remplaçant les deux jokers avec un paramètre de type nommé:

class XMLUtils {

    @SuppressWarnings("unchecked")
    public static <E extends Enum<E>> E getEnumAttribute(Element element, String name, 
            E defaultValue) {

        if (element.hasAttribute(name)) {
            String valueName = element.getAttribute(name);
            // search for value 
            for (Enum<?> value: defaultValue.getClass().getEnumConstants())
                if (value.toString().equalsIgnoreCase(valueName))
                    return (E) value;
        }
        // not found, return default value
        return defaultValue;
    } 
}

Mais je ne pense pas qu'il soit possible d'éliminer la distribution non contrôlée, parce que les rendements de Enum<E>.getClass() Class<Enum<?>> de sorte que le compilateur ne peut pas dire quel type de ENUM est contenu dans le tableau de enumConstants.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top