咨询Kotlin自定义枚举类中valueOf方法的定义位置
为什么Kotlin枚举的
valueOf()找不到定义位置? 这个问题我之前也碰到过,其实背后是Kotlin和Java枚举底层机制的联动,我给你拆解明白:
当你定义enum class Answer { YES, NO }时,你调用的valueOf()方法并不是写在某个现成的Kotlin源码文件里,而是由Kotlin编译器在编译过程中,为你的Answer枚举类自动生成的。
具体细节:
- Kotlin的枚举类本质上和Java枚举完全兼容,编译后会生成和Java枚举结构一致的字节码。在Java中,每个枚举类都会由编译器自动生成一个
static valueOf(String name)方法,用来根据字符串匹配对应的枚举常量。Kotlin只是把这个编译器生成的方法,暴露给Kotlin代码直接调用,所以你能在Kotlin里写Answer.valueOf("YES")拿到对应的枚举值。 - 你用IDEA的「Go to Implementation」只能跳回自己定义的
Answer枚举,是因为这个方法只存在于编译后的字节码中,没有对应的Kotlin源码文件。如果反编译Answer的字节码(IDEA就能直接做这个操作),你就能看到这个方法的具体实现了。 - 另外要注意:Kotlin的
kotlin.Enum基类本身并没有这个valueOf()方法——因为这个方法是每个具体枚举类独有的,用来匹配自己的枚举常量,不可能是所有枚举的通用方法。
给你看个反编译后的示例(把Kotlin枚举编译成字节码后转成Java代码),就能直观看到这个生成的方法:
public final class Answer extends Enum<Answer> { public static final /* enum */ Answer YES = new Answer("YES", 0); public static final /* enum */ Answer NO = new Answer("NO", 1); // 编译器自动生成的valueOf方法 public static Answer valueOf(String name) { return (Answer)Enum.valueOf(Answer.class, name); } // 还有编译器生成的values()方法 public static Answer[] values() { return (Answer[])VALUES.clone(); } private static final Answer[] VALUES; static { VALUES = new Answer[]{YES, NO}; } private Answer(String name, int ordinal) { super(name, ordinal); } }
你看,valueOf()是编译器给每个枚举类单独生成的静态方法,它内部其实是调用了Java核心类Enum.valueOf()来完成实际的常量查找工作。
所以简单说:这个valueOf()是编译器为你的Answer动态生成的,只存在于编译后的字节码里,没有对应的Kotlin源码文件,这就是为什么你找不到它的定义位置啦。
内容的提问来源于stack exchange,提问作者Jen
相关产品推荐
相关产品推荐

