Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Enum.valueOf(String)方法来自哪里?_Java_Compiler Construction_Enums_Value Of - Fatal编程技术网

Java Enum.valueOf(String)方法来自哪里?

Java Enum.valueOf(String)方法来自哪里?,java,compiler-construction,enums,value-of,Java,Compiler Construction,Enums,Value Of,在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>> valu

在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) 
T静态值(类枚举类型,字符串名称)
但是没有静态方法:
valueOf(String)
在Enum类中定义,也不在Enum所属的层次结构中定义

问题是
valueOf(String)
从何而来?
它是语言的一个功能,即编译器内置的功能吗?

此方法由编译器隐式定义

从文件中:

请注意,对于特定的枚举类型T,可以使用该枚举上隐式声明的公共静态T valueOf(String)方法代替此方法,以从名称映射到相应的枚举常量。枚举类型的所有常量都可以通过调用该类型的隐式公共静态T[]values()方法获得

从:

此外,如果E是枚举类型的名称,则该类型具有以下隐式声明的静态方法:


我认为这一定是语言的一个特点。例如,要通过创建一个枚举来创建一个枚举,它不需要扩展枚举:

public enum myEnum { red, blue, green }
这本身就是一种语言功能,否则您需要这样做:

public class  MyEnum extends Enum { ..... }
其次,当您使用myEnum.valueOf(String name)时,编译器必须生成方法
Enum.valueOf(Class enumType,String name)


这似乎是可能的,因为新的
Enum
既是一种语言功能,也是一个要扩展的类。

在Enum类的方法集中不包括此方法的原因是,只有在编译时知道返回的Enum值后才能提供实现(即:程序员定义的类型的枚举对象)。不过,另一种方法是在Enum类中将其声明为抽象方法,并让编译器在编译时提供一个实现。当然,这意味着它也可以被用户重写,但编译器也可以处理这种情况。将该方法放在类中看起来更自然!@Razvan Static methods c在Java(或者我想,大多数其他语言)中,语言不是抽象的。我没有说静态抽象!@Razvan你没有说静态,但它们是静态的。你是在建议将它们更改为非静态的吗?这不会降低它们的有用性吗?@sepp2k这是肯定的,因为你必须首先构建一个枚举实例,然后调用valueOf。我的建议是在类中使用该方法另一种选择是使用没有实现的静态方法,编译器应该在编译时提供实现。
public class  MyEnum extends Enum { ..... }