gpt4 book ai didi

scala - Scala : cannot declare reference to function using supertypes

转载 作者:行者123 更新时间:2023-12-02 10:45:32 25 4
gpt4 key购买 nike

为菜鸟问题道歉,但是我对Scala还是很陌生。

我有以下Scala类(class):

class Test {
class Request {def getValue(): String = {"request"}}
class Response {def getValue(): String = {"response"}}
case class MyRequest(message: String) extends Request
case class MyResponse(message: String) extends Response
val myFunction: (Request) => Response = doSomething
private val functions = scala.collection.mutable.Map[String, (Request) => Response](
"myFunction" -> myFunction
)
def doSomething(request: MyRequest): MyResponse = {
null
}
}

编译失败并出现以下错误:
type mismatch;
found : Test.this.MyRequest => Test.this.MyResponse
required: Test.this.Request => Test.this.Response
val myFunction: (Request) => Response = doSomething

如果我将myFunction和函数的声明更改为:
val myFunction: (MyRequest) => MyResponse = doSomething
private val functions = scala.collection.mutable.Map[String, (MyRequest) => MyResponse](
"myFunction" -> myFunction
)

但这不是我想要的-我希望能够向 map 添加具有不同具体类型(都扩展了Request或Response)的其他功能。因此,我想将 map 声明为接受Request或Response的任何子类。

知道我在做什么错吗?

最佳答案

您可以将doSomething的参数类型更改为Request,而不是MyRequest,它将起作用:

def doSomething(request: Request): MyResponse = {
null
}

为什么是这样?好吧,您不能将参数类型更具体的函数分配给参数类型不那么具体的变量。如果 doSomething的参数类型为 MyRequest,并且在 doSomething的主体中,我们调用了仅在 MyRequest上可用而在 Request上不可用的方法,那么如果有人调用myFunction并使用不同的 Request实现,在下面的示例中会发生什么?我们将破坏类型安全性。
val myFunction: (Request) => Response = doSomething

我们可以在 Function1特性的参数化类型中看到这一点:
trait Function1[-T1, +R]
-T1表示Function的参数是互变量的,这意味着具有较少特定参数类型的Function计为子类型(即 Request => Response Function可以分配给 MyRequest => Response类型的变量)。 +R表示函数返回类型是协变的,这意味着具有更特定返回类型的 Function计为子类型(即 Request => MyResponse可以分配给 Request => Response类型的变量)。

关于scala - Scala : cannot declare reference to function using supertypes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18646563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com