首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java有两个参数吗?

java有两个参数吗?
EN

Stack Overflow用户
提问于 2019-03-20 16:01:38
回答 3查看 3.4K关注 0票数 8

为什么valueOf有两个参数?

valueOf的Java文档

public static <T extends Enum<T>> T valueOf​(Class<T> enumType, String name) 参数: enumType -用于返回常量的枚举类型的类对象 名称-要返回的常量的名称

但我在网上读到的大多数例子都说:

代码语言:javascript
复制
enum WorkDays {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY;
}

测试:

代码语言:javascript
复制
WorkDays day1 = WorkDays.valueOf("MONDAY");
System.out.println(day1); // >>>  MONDAY

似乎该方法只使用了一个参数?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-20 16:23:14

您只需检查字节码,看看编译enum时会发生什么:

代码语言:javascript
复制
public enum TestEnum {A, B}

valueOf的字节码

代码语言:javascript
复制
// 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

我不是字节码方面的专家,但您可以看到行:

代码语言:javascript
复制
INVOKESTATIC java/lang/Enum.valueOf (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;

实际上,调用java.lang.Enum.valueOf。java的等价物如下所示:

代码语言:javascript
复制
public static TestEnum myValueOf(String name) {
    return Enum.valueOf(TestEnum.class, name);
}

字节码证实了这一点:

代码语言:javascript
复制
// 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

比较这两段你可以看到的区别是..。是的,名称(和行号):

票数 2
EN

Stack Overflow用户

发布于 2019-03-20 16:25:04

正如您在前面的评论中所指出的,您认为文档中的文本令人困惑,并且由于您的配置文件表明您是一个新手程序员:

Enum是您将声明的所有枚举的超类。在您的示例中,WorkDays可以看作是Enum类的一个特定案例。valueOf()静态方法文档是为这个父Enum类写的。这意味着在您的例子中,它将被称为:Enum.valueOf(WorkDays.class, "MONDAY")

现在,由于您创建了自己的Enum (即WorkDays),所以不需要使用这个静态父方法。您可以只使用由您自己创建的枚举公开的方法。

代码语言:javascript
复制
WorkDays.valueOf("Monday")

这是“隐式声明”,意味着它将存在于你自己创造的每一个枚举中。

票数 7
EN

Stack Overflow用户

发布于 2019-03-20 16:08:55

您共享的代码段使用了第二段中引用的隐式声明方法:

请注意,对于特定的枚举类型T,可以使用在该枚举上隐式声明的public static T valueOf(String)方法代替此方法从名称映射到相应的枚举常量。

第一段提到通过Enum类调用方法:

代码语言:javascript
复制
System.out.println(Enum.valueOf(WorkDays.class, "MONDAY"));
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55265192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档