Scala中case类与伴生对象apply方法默认参数冲突排查
Scala case类伴生对象apply默认参数编译错误原因解析
定义的Scala代码
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
applydefine default arguments
问题核心
case类会自动生成对应主构造器的apply方法,且该方法带有默认参数(对应remove、deduplicate、taskId三个参数的默认值);同时伴生对象中显式定义的apply方法也带有默认参数(tc: Option[TC] = None)。移除显式apply的默认参数后编译正常,但不清楚默认参数引发冲突的具体原因。
冲突原因解析
Scala语言规范明确限制:重载的方法中,不能有多个方法都定义了默认参数——哪怕两个apply方法的参数列表、类型差异很大,只要都是apply的重载版本且都带有默认参数,就会触发编译错误。
编译器的顾虑在于:存在潜在的歧义调用场景,比如当调用apply时省略部分参数,编译器无法确定应该匹配哪个重载版本的apply。你提到的apply$default$N是编译器为默认参数生成的辅助字段,但这不是冲突的直接原因,核心是Scala对重载方法默认参数的这条硬性规则。
当你移除伴生对象apply中tc的默认参数后,只有case类自动生成的apply带有默认参数,不再满足“多个重载方法都有默认参数”的条件,因此编译通过。
内容的提问来源于stack exchange,提问作者Niko
相关产品推荐
相关产品推荐

