Pregunta

Quiero pasar cualquier valor de enumeración al método en la clase de servicios públicos y obtener otro valor de enumeración del mismo tipo de enumeración. Algo como esto:

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;
    } 
}

El uso de getEnumAttribute() método:

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

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

Este código es completamente funcional, Eclipse compila y se ejecuta sin advertencias o errores y funciona como un encanto.

Pero cuando limpio y compilar el proyecto de línea de comandos por Maven2, se produce un error con el error en la línea en la que se llama getEnumAttribute:

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

Estoy utilizando Sun JDK 1.6, ya sea en Eclipse y 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"

Preguntas:

  1. ¿Por qué este código es compilables y funcional en Eclipse , y compilar fracasa en Maven , que el uso por lo que yo sé mismo compilador javac?

  2. ¿Qué pasa con el paso de las enumeraciones específicas a los parámetros genéricos Enum<?>?

Gracias,

Martin Schayna

¿Fue útil?

Solución

  1. Eclipse compilador javac y tienen algunas diferencias, sobre todo cuando se trata de los genéricos. Se cree que el eclipse es correcta, pero eso no importa:)

  2. Trate

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

Otros consejos

No sé qué versión de Eclipse que está utilizando, pero creo que está mal aquí. Mi versión reporta el mismo error que está viendo con Maven, lo que parece ser un error genuino.

El problema es que usted tiene dos comodines ("?") en la firma de getEnumAttribute() pero no hay ninguna limitación (y tampoco es posible crear uno) que les obliga a ser el mismo. Por lo que un cliente podría pasar en una enumeración de un tipo como el valor por defecto y obtener una enumeración de un tipo diferente a cambio.

Puede eliminar el error en el código de llamada mediante la sustitución de los dos comodines con un parámetro de tipo de llamada:

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;
    } 
}

Pero no creo que sea posible eliminar el reparto no se controla, porque los rendimientos Enum<E>.getClass() Class<Enum<?>> por lo que el compilador no puede decir qué tipo de enumeración contenida en la matriz enumConstants.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top