2012-04-22 20 views
1

はそれは不可能未定義の型パラメータの元でジェネリック型を拡張するものではない拡張するのですか?は、なぜ、すべての列挙型は、列挙型<e>

編集:も値()メソッドが定義されて?事前

+2

? 'Foo'は' Enum 'を拡張するべきです。 – bdonlan

+0

enumの型でenumを作成するときに暗黙的にeを定義していますか? http://www.docjar.com/html/api/java/lang/Enum.java.html – rubixibuc

+2

はここで、java.lang.Enumのソースです。クラス内のドキュメントは理由を示します。 – Thilo

答えて

5

おかげで未定義の型パラメータを持つジェネリック型を拡張するために実際には違法です。しかし、列挙型はそれをしません。いくつかのJavaコードを逆コンパイルして、<E>が見つかった場合(そしてあなたの列挙型の名前がEでない場合)、逆コンパイラはジェネリックスを適切に処理していません。

列挙型は、暗黙的にEnum<YourEnumType>を拡張します。つまり、コンパイラは暗黙的にclass YourEnumType extends Enum<YourEnumType>を生成します。独自のタイプを伝承することで、EnumcompareTovalueOf機能がenum秒の異なる種類から値を拒否することができます。あなたから を取得している

+0

enum genericに含まれていない場合、values()メソッドはどこに定義されていますか? – rubixibuc

+0

もちろん、生成されたクラスでは。 – bdonlan

+0

それは話す方法で人工的ですか? – rubixibuc