26

Java SE 7(およびおそらく以前のバージョン)では、Enumクラスは次のように宣言されています。

 public abstract class Enum<E extends Enum<E>>
 extends Object
 implements Comparable<E>, Serializable

Enumクラスには、次のシグネチャを持つ静的メソッドがあります。

  T static<T extends Enum<T>> valueOf(Class<T> enumType, String name) 

ただし、静的メソッドはありませんvalueOf(String)。Enumクラスで定義されているか、Enumが属する階層の上位に定義されています。

問題はどこvalueOf(String)から来るのかということです。それは言語の機能、つまりコンパイラに組み込まれている機能ですか?

4

2 に答える 2

23

このメソッドは、コンパイラーによって暗黙的に定義されます。

ドキュメントから:

特定の列挙型Tの場合、このメソッドの代わりに、その列挙で暗黙的に宣言されたpublic static T valueOf(String)メソッドを使用して、名前から対応する列挙定数にマップできることに注意してください。列挙型のすべての定数は、その型の暗黙的なpublic static T [] values()メソッドを呼び出すことで取得できます。

Java言語仕様のセクション8.9.2から:

さらに、Eが列挙型の名前である場合、その型には次の暗黙的に宣言された静的メソッドがあります。

/**
* Returns an array containing the constants of this enum 
* type, in the order they're declared.  This method may be
* used to iterate over the constants as follows:
*
*    for(E c : E.values())
*        System.out.println(c);
*
* @return an array containing the constants of this enum 
* type, in the order they're declared
*/
public static E[] values();

/**
* Returns the enum constant of this type with the specified
* name.
* The string must match exactly an identifier used to declare
* an enum constant in this type.  (Extraneous whitespace 
* characters are not permitted.)
* 
* @return the enum constant with the specified name
* @throws IllegalArgumentException if this enum type has no
* constant with the specified name
*/
public static E valueOf(String name);
于 2012-08-11T12:44:39.310 に答える
0

それは言語の特徴だと思います。1つは、列挙型を作成して列挙型を作成し、列挙型を拡張する必要がないことです。

public enum myEnum { red, blue, green }

それだけで、言語機能であるか、そうでなければこれを行う必要があります:

public class  MyEnum extends Enum { ..... }

次に、メソッド、、は、Enum.valueOf(Class<T> enumType, String name)を使用するときにコンパイラによって生成される必要がありますmyEnum.valueOf(String name)

Enum新しいものが拡張するクラスであるのと同じくらい多くの言語機能であることを考えると、それは可能と思われることです。

于 2012-08-11T13:20:33.067 に答える