gpt4 book ai didi

scala - 为什么案例类伴生对象要扩展 Function?

转载 作者:行者123 更新时间:2023-12-03 07:31:52 25 4
gpt4 key购买 nike

当您创建案例类时,编译器会创建一个相应的伴随对象,其中包含一些案例类的优点:与主构造函数匹配的 apply 工厂方法,equalshashCode复制

有点奇怪的是,这个生成的对象扩展了 FunctionN。

scala> case class A(a: Int)                                 
defined class A

scala> A: (Int => A)
res0: (Int) => A = <function1>

只有在以下情况下才会出现这种情况:

  • 没有手动定义的伴生对象
  • 只有一个参数列表
  • 没有类型参数
  • 案例类不是抽象的。

看起来这是 added大约两年前。最新的化身是here .

有人用过这个吗,或者知道为什么添加它?它使用静态转发器方法稍微增加了生成的字节码的大小,并显示在伴随对象的 #toString() 方法中:

scala> case class A()
defined class A

scala> A.toString
res12: java.lang.String = <function0>

更新

使用单个 apply 方法手动创建的对象不会自动被视为 FunctionN:

object HasApply {
def apply(a: Int) = 1
}
val i = HasApply(1)

// fails
// HasApply: (Int => Int)

最佳答案

案例类伴生对象之所以实现FunctionN,是因为之前案例类生成的是类和工厂方法,而不是伴生对象。当我们向 Scala 添加提取器时,将工厂方法转变为具有 apply 和 unapp 方法的完整伴生对象更有意义。但是,由于工厂方法确实符合 FunctionN,因此伴随对象也需要符合。

[编辑] 也就是说,让伴生对象显示为它们自己的名称,而不是“函数”是有意义的

关于scala - 为什么案例类伴生对象要扩展 Function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3049368/

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