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

带有替代方法的重载方法值选择

PHP 是不是有“方法重载”的规定,就像 java 和其他一些编程语言一样?如果没有,是不是有替代方案? [复制]

Go中函数重载的替代方案?