Java:特定的枚举和通用的Enum <?>参数

msc*_*yna 6 java eclipse compiler-construction generics javac

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

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;
    } 
}
Run Code Online (Sandbox Code Playgroud)

使用方法getEnumAttribute():

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

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

这段代码功能齐全,Eclipse编译并运行它没有警告或错误,它就像一个魅力.

但是当我通过Maven2从命令行清理和编译项目时,它会因为在线getEnumAttribute调用错误而失败:

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

我在Eclipse和Maven中使用Sun JDK 1.6:

$ 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"
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 为什么这个代码在Eclipse中可编译和运行,并且在Maven中编译失败,据我所知使用相同的javac编译器?

  2. 将特定枚举传递给泛型Enum<?>参数有什么问题?

谢谢,

马丁沙伊娜

Boz*_*zho 9

  1. Eclipse编译器和javac有一些差异,特别是在泛型方面.相信日食是正确的,但这无关紧要:)

  2. 尝试

    public static <T extends Enum<T>> Enum<T> getEnumAttribute(Element element, String name, 
        Enum<T> defaultValue) {
       ...
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 约束`<T extends Enum <T >>`是正确的但你可以使`T`(实际的枚举类型)返回类型而不是`Enum <T>`这是`T`的抽象超类. (2认同)