2017-11-29 5 views
0

私は、IDEAはvalueOf関数内でエラーWrong 1st argument type. Found: 'java.lang.Class<T>', required: 'java.lang.Class<T>'を報告し、次のコードEnumを拡張しないジェネリックのEnum.valueOfの代わりに?

protected <T> T func(Class<T> c) { 
    if (c.isEnum()) { 
     try { 
      return c.cast(Enum.valueOf(c, "string")); 
     } catch (IllegalArgumentException e) { 
      return null; 
     } 
    } 
    return null; 
} 

を持っています。関数のヘッダーに<T extends Enum<T>>を指定することでこのエラーを避けることができますが、考えられるのはTはenumだけでなく幅広い種類にすることができるということです。 Tを制限せずにコンパイル/実行するコードを取得することは可能ですか?

+0

'valueOf()'の最初の引数は列挙型でなければなりません....達成しようとしている動作は何ですか? 'valueOf()'は、非enumの最初の引数に対して何を返しますか?私はこれが[XY問題](http://xyproblem.info)だと思う。 –

+0

@JimGarrison 'valueOf'は、cがenumクラスでないか、その名前の定数を持たない場合にIllegalArgumentExceptionを投げる。したがって、 'func'はnullを返します。私は、このような方法が何のために使われているのか知ることは面白いと思っています。 –

+0

私が理解できないのは、コンパイル時の型安全性を逆転させて実行時に再適用するということです。何のために? @ジム・ギャリソン。 –

答えて

3

は、代わりに私がClass.getEnumConstants()

protected <T> T func(Class<T> c) { 
    if (c.isEnum()) 
     for (T t : c.getEnumConstants()) 
      if (((Enum<?>) t).name().equals("KG")) 
       return t; 
    return null; 
} 

にあれば、それは警告なしでコンパイルが、私はよく分からない。この方法を使用しましたこれはあなたが望むものです。

-1

クイックで不愉快な答え(より良いものがあると確信しています)。

valueOfで使用する前に、cClassにキャストすることができます。したがって

return (T) Enum.valueOf((Class) c, "string"); 

が動作します。提供できるEnumクラスだけがstringという名前の列挙定数を持っていることがわかっているならば。私はEnum.valueOf()を使用していない

おそらくいくつかの警告があまりにもそこに抑制する...

+0

'タイプの不一致:EnumからTに変換できません。 ' –

+0

@Jim Garrison https://ideone.com/5d0NEF。それでもいいとは言えませんが、型の不一致はありません。 – user2478398

関連する問題