2016-08-22 52 views
1

我使用的Java 6和我的应用程序是巨大的,它在Java开发的6 现在我们要升级Java版本为7的valueOf()枚举法是不是在java中工作7

但是,当我试过它到java 7它会给enum类编译错误。 在枚举类中,我定义了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; 
    } 
+2

一方面,在'类'参数未使用;对于另一个,它是多余的,因为该类型的唯一类是'TestEnum.class'。 –

+1

这段代码在TestEnum中得到了'error:name clash:valueOf(,String)类,并且中的valueOf(Class ,String)具有相同的擦除,但在使用'-source 1.6'编译时不隐藏另一个'。 – EJP

+0

@AndyTurner谢谢我删除类<>及其工作 –

回答

1

每个枚举是Enum<T>的一个子类。 Enum<T>已经定义了一个删除valueOf(Class,String)的静态方法。由于静态方法不能被覆盖,所以不能定义具有相同签名的静态方法。你将不得不以不同的方式调用你的方法。

6

我不确定它为什么在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()); 
    } 
}