gpt4 book ai didi

java - 枚举中的 valueOf() 方法在 Java 7 中不起作用

转载 作者:行者123 更新时间:2023-11-29 06:29:41 25 4
gpt4 key购买 nike

我正在使用 java 6,我的应用程序很大,它是用 java 6 开发的。现在我们尝试将 java 版本升级为 7。

但是当我尝试将其用于 java 7 时,它会在枚举类中给出编译错误。在枚举类中,我定义了 valueOf() 方法,因此在 Java 7 中它给出了编译错误。

代码

public enum TestEnum {
TESTONE,TESTTWO, NONE;

public String toString() {
switch(this) {
case TESTONE:
return "Test one";
case TESTTWO:
return "Test two";
case NONE:
return "None";
}
return null;
};

public static TestEnum valueOf(Class<TestEnum> enumType, String value){

if(value.equalsIgnoreCase(TESTONE.toString()))
return TestEnum.TESTONE;
else if(value.equalsIgnoreCase(TESTTWO.toString()))
return TestEnum.TESTTWO;
else if(value.equalsIgnoreCase(NONE.toString()))
return TestEnum.NONE;
else
return null;
}
}

错误

Name clash: The method valueOf(Class<TestEnum>, String) of type TestEnum has the 
same erasure as valueOf(Class<T>, String) of type Enum<E> but does not hide it TestEnum.java

更新(已解决)

我更改了 valueOf() 方法,我的文件已编译。

public static TestEnum valueOf(TestEnum enumType, String value){

if(value.equalsIgnoreCase(TESTONE.toString()))
return TestEnum.TESTONE;
else if(value.equalsIgnoreCase(TESTTWO.toString()))
return TestEnum.TESTTWO;
else if(value.equalsIgnoreCase(NONE.toString()))
return TestEnum.NONE;
else
return null;
}

最佳答案

我不确定为什么它在 Java 6 中工作,因为[具有该签名的方法以前存在于 Java 6 中](https://docs.oracle.com/javase/6/docs/api/java/lang/Enum.html#valueOf(java.lang.Class,java.lang.String))(自 Java 5 以来一直存在)。

但是,为了您的开发人员的理智,我强烈建议您重命名该方法:Enum.valueOf 做了一些众所周知的事情,并且您正试图提供一种方法做一些不同的事情。这将违反最小意外原则,并可能导致意外结果。

TestEnum.forName(String) 之类的名称是一种可能的替代方法。


另外:枚举中的 switch 覆盖该枚举类型的变量有点代码味道。您可以更好地表达枚举:

enum TestEnum {
TESTONE("Test one"),TESTTWO("Test two"), NONE("None");

private String str;

private TestEnum(String str) {
this.str = str;
}

@Override public String toString() {
return str;
}
}

它的额外优势是您不会意外地省略您添加的任何其他枚举值的“字符串”形式。

同样,您可以比显式测试字符串值做得更好:

enum TestEnum {
/* values */;

private static HashMap<String, TestEnum> forNameMapping;
{
forNameMapping = new HashMap<>();
for (TestEnum t : TestEnum.values()) {
forNameMapping.put(t.str.toLowerCase(), t);
}
}

public static TestEnum forName(String str) {
return forNameMapping.get(str.toLowerCase());
}
}

关于java - 枚举中的 valueOf() 方法在 Java 7 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39073513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com