scala 方法apply的多个重载替代定义默认参数

nx7onnlm  于 2023-10-18  发布在  Scala
关注(0)|答案(1)|浏览(132)

我有以下案例类

case class Task[I, O](
    dd: DD,
    parser: CP[I, (O, Option[CE])],
    canonicalize: Boolean,
    opt: Boolean,
    schema: Schema,
    remove: Boolean = false,
    deduplicate: Boolean = false,
    taskId: Option[String] = None
)(implicit
    val ul: UL[O],
    val ael: AEL[O],
    val it: IT[I],
    val ot: TT[O]
)

object Task {
  def apply(
      dd: DD,
      sources: Sources,
      cc: String,
      tc: Option[TC] = None
  )(implicit
      context: PEC
  )
}

我得到了

multiple overloaded alternatives of method `apply` define default arguments

显然,这里没有多个apply方法。有一个显式定义的apply方法,另一个由于case类而隐式定义。我必须提到,如果我从伴随对象的apply方法中删除tc: Option[TC] = None,编译就成功了。我理解here提供的解释,但我不明白tc: Option[TC] = None是如何破坏编译的。
//编辑
更明确地说明编译器生成的内容。对于从case类生成的隐式apply方法,

apply$default$6:Boolean = false
apply$default$7:Boolean = false
apply$default$8:Option[String] = None

对于我定义的显式apply,它只会创建

apply$default$4:Option[TC] = None

至少我是这么理解的冲突到底在哪里?

juud5qan

juud5qan1#

Scala不允许在多个重载方法中存在默认值。默认值的位置或数据类型无关紧要。其中一个方法可能是apply方法,这一点也不重要。
这将工作

class Foo(a: String, b: String) {
  def apply(c: Int = 3) = new Foo(c.toString, c.toString)

  def other(a: Int = 1, b: String) = println(a, b)
}

这是行不通的

class Foo(a: String, b: String) {
  def apply(c: Int = 3) = new Foo(c.toString, c.toString)

  def other(a: Int = 1, b: String) = println(a, b)
  def other(a: Int, b: String = "foo", c: Float) = println(a, b, c)
}

这是行不通的

class Foo(a: String, b: String) {
  def apply(c: Int = 3) = new Foo(c.toString, c.toString)
  def apply(d: Int, e: Int = 100) = new Foo(d.toString, e.toString)

  def other(a: Int, b: String = "foo", c: Float) = println(a, b, c)
}

相关问题