2016-08-22 53 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()); 
    } 
}