gpt4 book ai didi

scala - 为什么 Scala 案例类生成两个应用方法?

转载 作者:行者123 更新时间:2023-12-01 13:19:11 24 4
gpt4 key购买 nike

我正在尝试探索 scala 案例类的内部结构。为此,我创建了简单的案例类并分析了 scala 编译器使用 javap 创建的字节码。

我很惊讶地发现,当我创建一个只有一个字符串字段的案例类时:

case class MyCaseClass(value: String)

伴随对象 MyCaseClass$ 的字节码包含两个 apply 方法:

  public MyCaseClass apply(java.lang.String);
Code:
0: new #23 // class MyCaseClass
3: dup
4: aload_1
5: invokespecial #26 // Method MyCaseClass."<init>":(Ljava/lang/String;)V
8: areturn

public java.lang.Object apply(java.lang.Object);
Code:
0: aload_0
1: aload_1
2: checkcast #53 // class java/lang/String
5: invokevirtual #55 // Method apply:(Ljava/lang/String;)LMyCaseClass;
8: areturn

(使用scalac 2.11.6编译)

第一个是我所期望的 - 将 String 作为参数并创建我的案例类的一个新实例,将此参数传递给构造函数。第二个获取一个对象,将其转换为 String,然后调用第一个。

我想不出第二种方法有什么用处。为什么需要它?这种行为是否记录在任何地方?

最佳答案

默认伴随对象扩展函数类型,在本例中为 Function1[String, MyCaseClass](在 Scala 中通常写为 String => MyCaseClass)。

Function1#apply 的 JVM 签名是 Object apply(Object) 因此覆盖方法必须具有相同的签名。

关于scala - 为什么 Scala 案例类生成两个应用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51407840/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com