为什么valueOf有两个参数?
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)参数: enumType -用于返回常量的枚举类型的类对象 名称-要返回的常量的名称
但我在网上读到的大多数例子都说:
enum WorkDays {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY;
}测试:
WorkDays day1 = WorkDays.valueOf("MONDAY");
System.out.println(day1); // >>> MONDAY似乎该方法只使用了一个参数?
发布于 2019-03-20 16:23:14
您只需检查字节码,看看编译enum时会发生什么:
public enum TestEnum {A, B}和valueOf的字节码
// access flags 0x9
public static valueOf(Ljava/lang/String;)LTestEnum;
L0
LINENUMBER 1 L0
LDC LTestEnum;.class
ALOAD 0
INVOKESTATIC java/lang/Enum.valueOf (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
CHECKCAST TestEnum
ARETURN
L1
LOCALVARIABLE name Ljava/lang/String; L0 L1 0
MAXSTACK = 2
MAXLOCALS = 1我不是字节码方面的专家,但您可以看到行:
INVOKESTATIC java/lang/Enum.valueOf (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;实际上,调用java.lang.Enum.valueOf。java的等价物如下所示:
public static TestEnum myValueOf(String name) {
return Enum.valueOf(TestEnum.class, name);
}字节码证实了这一点:
// access flags 0x9
public static myValueOf(Ljava/lang/String;)LTestEnum;
L0
LINENUMBER 6 L0
LDC LTestEnum;.class
ALOAD 0
INVOKESTATIC java/lang/Enum.valueOf (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
CHECKCAST TestEnum
ARETURN
L1
LOCALVARIABLE name Ljava/lang/String; L0 L1 0
MAXSTACK = 2
MAXLOCALS = 1比较这两段你可以看到的区别是..。是的,名称(和行号):

发布于 2019-03-20 16:25:04
正如您在前面的评论中所指出的,您认为文档中的文本令人困惑,并且由于您的配置文件表明您是一个新手程序员:
Enum是您将声明的所有枚举的超类。在您的示例中,WorkDays可以看作是Enum类的一个特定案例。valueOf()静态方法文档是为这个父Enum类写的。这意味着在您的例子中,它将被称为:Enum.valueOf(WorkDays.class, "MONDAY")。
现在,由于您创建了自己的Enum (即WorkDays),所以不需要使用这个静态父方法。您可以只使用由您自己创建的枚举公开的方法。
WorkDays.valueOf("Monday")这是“隐式声明”,意味着它将存在于你自己创造的每一个枚举中。
发布于 2019-03-20 16:08:55
您共享的代码段使用了第二段中引用的隐式声明方法:
请注意,对于特定的枚举类型
T,可以使用在该枚举上隐式声明的public static T valueOf(String)方法代替此方法从名称映射到相应的枚举常量。
第一段提到通过Enum类调用方法:
System.out.println(Enum.valueOf(WorkDays.class, "MONDAY"));https://stackoverflow.com/questions/55265192
复制相似问题