作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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/
我是一名优秀的程序员,十分优秀!