Java:特定枚举和通用枚举<&燃气轮机;参数

Java:特定枚举和通用枚举<&燃气轮机;参数,java,eclipse,generics,compiler-construction,javac,Java,Eclipse,Generics,Compiler Construction,Javac,我想将任何枚举值传递给实用程序类中的方法,并获取相同枚举类型的另一个枚举值。大概是这样的: public class XMLUtils { public static Enum<?> getEnumAttribute(Element element, String name, Enum<?> defaultValue) { if (element.hasAttribute(name)) { St

我想将任何枚举值传递给实用程序类中的方法,并获取相同枚举类型的另一个枚举值。大概是这样的:

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;
    } 
}
这段代码功能齐全,Eclipse编译并运行它时不会出现警告或错误,而且工作起来很有魅力

但是,当我使用Maven2从命令行清理并编译项目时,它失败了,在
getEnumAttribute
调用的第行出现了错误

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

  • 为什么这段代码在Eclipse中是可编译的,并且功能正常,而在Maven中编译失败,据我所知,Maven使用的是同一个javac编译器

  • 将特定枚举传递给泛型
    Enum
    参数有什么问题

  • 谢谢

    马丁·夏纳

  • Eclipse编译器和javac有一些区别,特别是在泛型方面。人们相信日食是正确的,但这并不重要:)

  • 试一试

    public static <T extends Enum<T>> Enum<T> getEnumAttribute(Element element, String name, 
        Enum<T> defaultValue) {
       ...
    }
    
    公共静态枚举getEnumAttribute(元素、字符串名称、,
    枚举默认值){
    ...
    }
    

  • 我不知道您使用的是什么版本的Eclipse,但我认为这是错误的。我的版本报告了与Maven相同的错误,这似乎是一个真正的错误

    问题是
    getEnumAttribute()
    的签名中有两个通配符(
    “?”
    ),但没有强制它们相同的约束(也不可能创建一个)。因此,客户机可以传入一种类型的枚举作为默认值,并获得另一种类型的枚举作为返回

    通过使用命名类型参数替换两个通配符,可以消除调用代码中的错误:

    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;
        } 
    }
    
    类XMLUtils{ @抑制警告(“未选中”) 公共静态E getEnumAttribute(元素、字符串名称、, (默认值){ if(element.hasAttribute(name)){ 字符串valueName=element.getAttribute(名称); //寻找价值 对于(枚举值:defaultValue.getClass().getEnumConstants()) if(value.toString().equalsIgnoreCase(valueName)) 返回(E)值; } //未找到,返回默认值 返回默认值; } }
    但是我认为不可能消除未经检查的强制转换,因为
    Enum.getClass()
    返回
    class谢谢,你完全正确,伙计!使用您的替代方法签名,我的源代码可以在Eclipse和Maven中编译。我对两个编译器之间的差异有点困惑。。。无论如何,再次谢谢你!约束
    是正确的,但您可以将
    T
    (实际枚举类型)设置为返回类型,而不是
    enum
    ,后者是
    T
    的抽象超类。感谢您的理论分析,特别是对两种不同枚举类型的“不必要”容差(一种用于
    defaultValue
    ,另一种用于结果)这很重要,但对我来说,它可能不会导致很多错误。为了完整性:我使用的是Eclipse3.5.1。我删除了maven-2标记,因为这不是一个与maven相关的问题,而是一个纯粹的Eclipse/javac编译器问题。Eclipse有自己的编译器,独立于JDK。这就是为什么它不需要安装JDK(您只需要JRE)
    public static <T extends Enum<T>> Enum<T> getEnumAttribute(Element element, String name, 
        Enum<T> defaultValue) {
       ...
    }
    
    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;
        } 
    }