Why does the Scala compiler disallow overloaded methods with default arguments?

后端 未结 7 1816
失恋的感觉
失恋的感觉 2020-11-29 19:26

While there might be valid cases where such method overloadings could become ambiguous, why does the compiler disallow code which is neither ambiguous at compile time nor at

7条回答
  •  心在旅途
    2020-11-29 19:43

    Here is a generalization of @Landei answer:

    What you really want:

    def pretty(tree: Tree, showFields: Boolean = false): String = // ...
    def pretty(tree: List[Tree], showFields: Boolean = false): String = // ...
    def pretty(tree: Option[Tree], showFields: Boolean = false): String = // ...
    

    Workarround

    def pretty(input: CanPretty, showFields: Boolean = false): String = {
      input match {
        case TreeCanPretty(tree)       => prettyTree(tree, showFields)
        case ListTreeCanPretty(tree)   => prettyList(tree, showFields)
        case OptionTreeCanPretty(tree) => prettyOption(tree, showFields)
      }
    }
    
    sealed trait CanPretty
    case class TreeCanPretty(tree: Tree) extends CanPretty
    case class ListTreeCanPretty(tree: List[Tree]) extends CanPretty
    case class OptionTreeCanPretty(tree: Option[Tree]) extends CanPretty
    
    import scala.language.implicitConversions
    implicit def treeCanPretty(tree: Tree): CanPretty = TreeCanPretty(tree)
    implicit def listTreeCanPretty(tree: List[Tree]): CanPretty = ListTreeCanPretty(tree)
    implicit def optionTreeCanPretty(tree: Option[Tree]): CanPretty = OptionTreeCanPretty(tree)
    
    private def prettyTree(tree: Tree, showFields: Boolean): String = "fun ..."
    private def prettyList(tree: List[Tree], showFields: Boolean): String = "fun ..."
    private def prettyOption(tree: Option[Tree], showFields: Boolean): String = "fun ..."
    

提交回复
热议问题