任何想法如何使以下内容工作:
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)
}
}