Java (错误:Enum<;E>;类型的valueOf(Class<;T>;,String),但未将其隐藏)将版本从jdk1.6升级到jdk1.7

Java (错误:Enum<;E>;类型的valueOf(Class<;T>;,String),但未将其隐藏)将版本从jdk1.6升级到jdk1.7,java,enums,Java,Enums,当我在eclipse中将java版本从jdk1.6升级到jdk1.7时,下面的错误只在编译模式下出现 错误是: 名称冲突:TestEnum类型的方法valueOf(类,字符串)与Enum类型的valueOf(类,字符串)具有相同的擦除,但不会隐藏它 public enum TestEnum{ ABC; 公共静态TestEnumValueOf(类enumType,字符串值){//此错误将在此行抛出。 返回null; }; } 当我将编译级别从1.7更改为1.6时,错误就消失了。 我不明白为什么编

当我在eclipse中将java版本从jdk1.6升级到jdk1.7时,下面的错误只在编译模式下出现

错误是:

名称冲突:TestEnum类型的方法valueOf(类,字符串)与Enum类型的valueOf(类,字符串)具有相同的擦除,但不会隐藏它

public enum TestEnum{
ABC;
公共静态TestEnumValueOf(类enumType,字符串值){//此错误将在此行抛出。
返回null;
};
}
当我将编译级别从1.7更改为1.6时,错误就消失了。 我不明白为什么编译级别1.7不起作用?编译1.7级是否还需要其他更改

编辑:


它返回具有指定名称的指定枚举类型的枚举常量。名称必须与用于在此类型中声明枚举常量的标识符完全匹配。但我没有这种情况,名称不同。有100多个枚举类具有相同的实现。对我来说,改变这种产品范围内的变化是不容易的

public enum TestEnum {
    ABC;
    public String toString() {
        switch (this) {
        case ABC:
            return "Abc";
        }
        return "";
    }
/*  public static TestEnum valueOf(Class<TestEnum> enumType, String value){
        if(value.equalsIgnoreCase("XYZ")){
            return ABC;
        }
        return null;

    };*/

    public static void main(String[] args) {
        TestEnum t=TestEnum.valueOf(TestEnum.class,"Abc");
        System.out.println(t);

    }

}
public enum TestEnum{
ABC;
公共字符串toString(){
开关(本){
案例ABC:
返回“Abc”;
}
返回“”;
}
/*公共静态TestEnumValueof(类enumType,字符串值){
if(value.equalsIgnoreCase(“XYZ”)){
返回ABC;
}
返回null;
};*/
公共静态void main(字符串[]args){
TestEnum t=TestEnum.valueOf(TestEnum.class,“Abc”);
系统输出打印ln(t);
}
}
> 线程“main”java.lang.IllegalArgumentException中的异常:没有枚举常量com.test.example.TestEnum.Abc 位于java.lang.Enum.valueOf(Enum.java:236) 位于com.test.example.TestEnum.main(TestEnum.java:22)


问题在于
static T Enum.valueOf(Class enumType,String name)
与您的
public static TestEnum valueOf(Class enumType,String value)
不同,但在类型擦除后外观相同(两者基本上都成为静态对象valueOf(Class enumType,String value))


由于这可能导致不直观的行为,Java创建者认为这应该是一个错误;相应的检查是在Java 1.7中实现的像
Enum.valueOf
,您可以简单地删除它。否则,重命名它可以解决问题。

它返回指定枚举类型的枚举常量和指定的名称。该名称必须与用于声明此类型中枚举常量的标识符完全匹配。但我没有这种情况,名称不同。有100以上具有相同实现的枚举类。对我来说,更改此类产品范围的更改并不容易。从您的评论中,我了解到valueOf方法的行为完全符合预期,因此可以在不破坏源代码兼容性的情况下安全地删除。我将使用sed脚本或其他方式进行项目全局搜索并替换
静态([\w\d\]*)值of(Class
,带有
@已弃用的私有静态\1\u值of(Class
)。
public enum TestEnum {
    ABC;
    public String toString() {
        switch (this) {
        case ABC:
            return "Abc";
        }
        return "";
    }
/*  public static TestEnum valueOf(Class<TestEnum> enumType, String value){
        if(value.equalsIgnoreCase("XYZ")){
            return ABC;
        }
        return null;

    };*/

    public static void main(String[] args) {
        TestEnum t=TestEnum.valueOf(TestEnum.class,"Abc");
        System.out.println(t);

    }

}