2017-10-20 15 views
1

以下のメソッドgetFirstFromEnumでは、返されたenum型が引数として渡されたクラスであることは常に真です。それを考慮して、とにかく私はそれを呼び出すたびにキャスティングを避けるためにメソッドを変更することができますか?一般的な戻り値でのキャストを避けるにはどうすればよいですか?

private <E extends Enum<?>> Enum<?> getFirstFromEnum(Class<E> enumClass) { 
    return enumClass.getEnumConstants()[0]; 
} 

EnumA foo = (EnumA) getFirstFromEnum(EnumA.class); //can I change method to avoid casting? 

答えて

5

実際にはEnum<?>を返します。
戻り値は、渡されたenumの値を引数としてEnumです。
したがって、渡された特定のEnumタイプを表すので、戻り値にEを指定してください。

あなたはそう書くことができます:

private <E extends Enum<?>> E getFirstFromEnum(Class<E> enumClass) { 
    return enumClass.getEnumConstants()[0]; 
} 
+0

はあなたが私に交換の必要性を説明しようとすることができ、 'が伸びる>'と '' 拡張します>。彼らはどちらもうまくいくようです – user2651804

+0

うーん...正直なところ、私は分かりません。私はできるだけ強くタイプする習慣があります。しかし、あなたは正しいです:ここでは必須ではありません。それは構文的な砂糖のように見えます。私はこの部分をそのまま維持するように更新しました。 – davidxxx

+0

@ user2651804:これは 'java.lang.Enum'がなぜ' Enum > 'または' Enum 'の代わりに' Enum > 'として定義されたのかという疑問に終わります。一見すると、その背後に重要性があるように見えますが、実際にはそれは完全に機能しません。 Comparable >の代わりに 'Comparable 'として定義されているjava.lang.Comparableによって示されているように、... – Holger

関連する問題