Scala:方法的多个重载替代方案
Posted
技术标签:
【中文标题】Scala:方法的多个重载替代方案【英文标题】:Scala: multiple overloaded alternatives of method 【发布时间】:2021-12-22 05:56:58 【问题描述】:我有这个代码:
case class Sorting(field: String = "createdAt", order:
SortingOrder = SortingOrder.Desc)
object Sorting
sealed trait SortingOrder
object SortingOrder
case object Desc extends SortingOrder
case object Asc extends SortingOrder
def apply(field: Option[String], order: Option[SortingOrder], defaultSortField: String = "createdAt"): Sorting =
Sorting(
field.getOrElse(defaultSortField),
order.getOrElse(SortingOrder.Desc)
)
这给出了错误:
in object Sorting, multiple overloaded alternatives of method apply define default arguments.
我怎么不见了?
【问题讨论】:
好吧,没有看到Sorting
的代码是不可能的。
我已经添加了完整的代码。
【参考方案1】:
Scala 编译器将在companion object 中生成默认的apply
方法,该方法将使用您的案例类构造函数参数,即具有默认值的case class Sorting(field: String = "createdAt", order: SortingOrder = SortingOrder.Desc)
。然后你声明了另一个 apply
方法,它也有默认参数,Scala 不允许有 overloaded methods with default arguments。
因此,您需要从案例类 (compiles) 或自定义应用方法 (compiles also) 中删除默认参数,或者通过创建额外的 apply
重载 (compiles) 手动处理自定义默认案例:
case class Sorting(field: String = "createdAt", order: SortingOrder = SortingOrder.Desc)
object Sorting
sealed trait SortingOrder
object SortingOrder
case object Desc extends SortingOrder
case object Asc extends SortingOrder
def apply(field: Option[String], order: Option[SortingOrder]): Sorting = apply(field, order, "createdAt")
def apply(field: Option[String], order: Option[SortingOrder], defaultSortField: String): Sorting =
Sorting(
field.getOrElse(defaultSortField),
order.getOrElse(SortingOrder.Desc)
)
【讨论】:
以上是关于Scala:方法的多个重载替代方案的主要内容,如果未能解决你的问题,请参考以下文章
如何使用替代方法解决重载方法值寄存器,UDF Spark scala
如果我在 Scala 中定义多个重载构造函数,我不能定义默认值吗?
scala.collection.immutable.Iterable[org.apache.spark.sql.Row] 到 DataFrame ?错误:使用替代方法重载了方法值 createDat