2015-03-19 17 views
1

當我在eclipse中將jdk1.6升級到jdk1.7時,下面的錯誤已經開始只在編譯模式下。(Error:valueOf(Class <T>,字符串)類型Enum <E>但不隱藏它)將版本從jdk1.6升級到jdk1.7

的錯誤是:

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

public enum TestEnum { 
    ABC; 
    public static TestEnum valueOf(Class<TestEnum> enumType, String value){//This error throw at this line. 
     return 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); 

    } 

} 

> Exception in thread "main" java.lang.IllegalArgumentException: No enum constant com.test.example.TestEnum.Abc at java.lang.Enum.valueOf(Enum.java:236) at com.test.example.TestEnum.main(TestEnum.java:22)

回答

3

的問題是,static <T extends Enum<T>> T Enum.valueOf(Class<T> enumType, String name)是不一樣的你public static TestEnum valueOf(Class<TestEnum> enumType, String value),但看起來是一樣的類型擦除後(兩者實質上成爲靜態對象的valueOf(類enumType,字符串值)。

由於這可能會導致不直觀的行爲,Java創建者認爲這應該是一個錯誤;相應的檢查是在Java 1.7中實現的,如果您的valueOf方法的行爲(或應該表現爲)如Enum.valueOf,您可以簡單地刪除它,否則重命名它可以解決問題

+0

它返回具有指定名稱的指定枚舉類型的枚舉常量。該名稱必須完全匹配用於在此類型中聲明枚舉常量的標識符。但我沒有這樣的情況,名稱不同。以上有100個枚舉類,具有相同的實現。我不容易改變這種產品的廣泛變化。 – iMBMT 2015-03-19 12:47:06

+0

從您的評論我收集valueOf-Methods行爲完全按預期,因此可以安全地刪除而不破壞源代碼兼容性。我將使用sed-script或其他方式進行項目全局搜索,並用'@Deprecated private static \ 1 _valueOf(Class <\1>''替換並替換'static([\ w \ d _] *)valueOf(類<\1>''。 – llogiq 2015-03-19 13:00:36

相關問題