【问题标题】:(Error: valueOf(Class<T>, String) of type Enum<E> but does not hide it) Upgrade version from jdk1.6 to jdk1.7(错误:Enum<E> 类型的 valueOf(Class<T>, String) 但不隐藏)从 jdk1.6 升级到 jdk1.7
【发布时间】:2015-03-19 08:08:32
【问题描述】:

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

错误是:

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

public enum TestEnum {
    ABC;
    public static TestEnum valueOf(Class<TestEnum> enumType, String value){//This error throw at this line.
        return 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);

    }

}

> 线程“主”java.lang.IllegalArgumentException 中的异常:没有枚举常量 com.test.example.TestEnum.Abc 在 java.lang.Enum.valueOf(Enum.java:236) 在 com.test.example.TestEnum.main(TestEnum.java:22)

【问题讨论】:

    标签: java enums


    【解决方案1】:

    问题是static &lt;T extends Enum&lt;T&gt;&gt; T Enum.valueOf(Class&lt;T&gt; enumType, String name) 和你的public static TestEnum valueOf(Class&lt;TestEnum&gt; enumType, String value) 不一样,但是类型擦除后看起来一样(两者本质上都变成了 static Object valueOf(Class enumType, String value)。

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

    【讨论】:

    • 返回具有指定名称的指定枚举类型的枚举常量。该名称必须与用于在此类型中声明枚举常量的标识符完全匹配。但我没有这种情况,名称不同。上面有 100 个枚举 类具有相同的实现。改变这种产品范围的变化对我来说并不容易。
    • 从您的评论中,我了解到 valueOf-Methods 的行为完全符合预期,因此可以在不破坏源兼容性的情况下安全地删除。我会使用 sed 脚本或其他项目全局搜索方法,并用 @Deprecated private static \1 _valueOf(Class&lt;\1&gt; 替换和替换 static ([\w\d_]*) valueOf(Class&lt;\1&gt;。
    猜你喜欢
    • 2021-08-31
    • 1970-01-01
    • 2011-10-27
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多