Scala隐式类和重载现有函数

Scala隐式类和重载现有函数,scala,implicit,Scala,Implicit,您知道如何让以下各项发挥作用吗: 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:S

您知道如何让以下各项发挥作用吗:

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
trait-HttpTransport{
def doGet(str:String):String
}
特征CoreGet{
def GET(str:String)(隐式imp:String):列表[String]
}
trait VerbGet使用HttpTransport扩展CoreGet{
覆盖def GET(str:String)(隐式imp:String):列表[String]={
println(“->VerbGet.GET”)
val str1=doGet(str)
//这里还有更多的商业逻辑电话
列表“\nverb(业务逻辑)调用url$str并获得“${str1}>”)
}
}
//玩偶{
隐式类extendreget(coreGet:coreGet){
def GET[A](url:String)(隐式imp:String,imp2:List[A]):List[A]={
println“->extendedcreget.GET($url)”)
val coreGetResult=coreGet.GET(url)
coreGetResult.flatMap(=>imp2)
}
}
特质游戏扩展了HttpTransport{
覆盖def doGet(str:String):String={
println(“->Play.doGet”)
s“\n播放doGet($str)>”
}
}
val client=具有播放功能的新VerbGet

client.GET(“www.go.com”)(“你好”,List(“1”)/看起来您正在尝试扩展VerbGet的功能。您需要解决两个问题:
1.
extendedcreget
必须扩展
AnyVal
才能添加更多方法。
2.您可以通过添加新方法(比如
GET2
)来添加新功能,但不能重载现有方法。请将
GET
重命名为
GET2
或其他有意义的方法

扩展规则定义应为

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)
  }
}

恐怕这个练习的全部目的都是为了重载GET。将其重命名为GET2对我来说是行不通的。那么你是说根本不可能重载GET吗?正常函数(不使用currying)应该可以重载GET,但使用currying时,不确定当你说GET(“hello”)时编译器如何决定.1.它通常会提高性能(不是很多),但“必须”是错误的。因此,似乎当curry函数重载时,Scala中的解析只考虑第一个参数列表:(参见Martin Odersky的答案)可以通过区分第一个参数组来重载一个方法。之后就不能这样做了。