Scala隐式类并超载现有功能



任何想法如何使以下内容工作:

trait HttpTransport {
  def doGet(str: String): String
}
trait CoreGet {
  def GET(str: String)(implicit imp:String): List[String]
}

trait VerbGet extends CoreGet with HttpTransport {
  override def GET(str: String)(implicit imp:String): List[String]= {
    println("->VerbGet.GET")
    val str1 = doGet(str)
    // and more biz logic calls here
    List(s"nverb (biz logic) called url $str and got '${str1}'>")
  }
}
// PlayGet {
implicit class ExtendCoreGet(coreGet: CoreGet) {

  def GET[A](url: String)(implicit imp:String, imp2: List[A]): List[A]= {
    println(s"->ExtendCoreGet.GET($url)")
    val coreGetResult = coreGet.GET(url)
    coreGetResult.flatMap(_ => imp2)

  }
}
trait Play extends HttpTransport {
  override def doGet(str: String): String = {
    println("->Play.doGet")
    s"nPlay.doGet($str)>"
  }
}

val client = new VerbGet with Play
client.GET("www.go.com")("hello", List("1"))  //<-- does not compile

编译器错误:

用于方法的参数太多(2(get :(隐式imp: 字符串(列表[字符串]

您可以在此处使用代码:https://scastie.scala-lang.org/arminio/tn9nfdxgqumusrnl0lj78w

看起来您正在尝试扩展动词的功能。您需要修复两件事:
1. ExtendCoreGet必须扩展AnyVal才能添加更多方法。
2.您可以通过添加新方法来添加新功能,说GET2,但是您无法超载现有方法。将您的GET倍增到GET2或有意义的东西。

ExtendCoreget定义应为

implicit class ExtendCoreGet(val coreGet: CoreGet) extends AnyVal {
  def GET2[A](url: String)(implicit imp:String, imp2: List[A]): List[A]= {
    coreGet.GET(url).flatMap(_ => imp2)
  }
}

最新更新