Java (错误:Enum<;E>;类型的valueOf(Class<;T>;,String),但未将其隐藏)将版本从jdk1.6升级到jdk1.7
当我在eclipse中将java版本从jdk1.6升级到jdk1.7时,下面的错误只在编译模式下出现 错误是: 名称冲突:TestEnum类型的方法valueOf(类,字符串)与Enum类型的valueOf(类,字符串)具有相同的擦除,但不会隐藏它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时,错误就消失了。 我不明白为什么编
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);
}
}