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的答案)可以通过区分第一个参数组来重载一个方法。之后就不能这样做了。