2016-08-22 8 views
1

で作業されていませんjava 7にしようとすると、enumクラスでコンパイルエラーが発生します。 enumクラスでは、valueOf()メソッドを定義しているので、Java 7ではコンパイルエラーが発生します。のvalueOf()メソッドは、私は、Java 6を使用していますし、私のアプリケーションは巨大であり、そのJavaの6 で開発された今、私たちは7</p> <p>としてJavaのバージョンをアップグレードしようとしているが、ときに私の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(Class 、String)を、Enumに valueOf(Class 、String)を同じ消しゴムを持ちますが、' -source 1.6'でコンパイルしたときに、 – EJP

+0

@AndyTurnerありがとうございました。Class <>とその動作を削除しました。 –

答えて

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()); 
    } 
} 
関連する問題