【发布时间】:2020-07-19 06:55:52
【问题描述】:
我有一个Person 的特征,以及一个从这个特征继承的案例类,我希望我有一个函数,除了从Person 到Future[Person] 的函数之外,我会从@ 传递它987654328@ 到 Future[Male] 将通过。像这样:
trait Person {
val name: String
val age: Int
}
case class Male (override val name: String, override val age: Int, height: Double) extends Person
val male1 = Male(name = "John", age = 30, height = 1.80)
def something(person: Person => Future[Person]): Unit = {
println(s"person is $person")
}
def maleToFutureMale (male: Male) = Future.successful(male)
something(maleToFutureMale)
但得到编译错误:
【问题讨论】:
-
它是逆变的。
Male是Person,但Male => Future[Male]不是Person => Future[Person],因为它必须以Male的值传递。想象一下打电话给maleToFutureMale(aFemale)。如果你可以将它传递给something,something可以做到这一点 -
那么我该怎么做呢?因为我确实想要这种行为,创建一个函数,该函数将采用继承自 Person 的类并在其上运行
something。例如,我想将男性功能从 matl 传递到未来的男性和女性到未来的女性到something@AluanHaddad -
没有更多上下文,我会写
def something[P <: Person](toFuture: P => Future[P]): Unit。但是,这取决于您使用该功能做什么。在您的示例中,它没有被调用。 -
此外,Function1 的参数类型是逆变的,结果类型是协变的。 scala-lang.org/api/2.12.2/scala/Function1.html 这意味着您可以在那里拥有一个函数,其中输入是 Person 的超类型,结果是子类型。像 Kotlin 这样的其他语言通过 in/out 注释让新手更容易理解,在 scala 中我们有 + 和 -。 @AluanHaddad 你会把你的评论写成答案,这样我们就可以投票/接受它。