的,我有以下代码Scala的类型推断未能推断类型的通用功能
def sendMoney[T <: MoneyType](fn: T => Future[T], input: T): Unit
被称为这样
case x: Any => (sendMoney(_, _).tupled(x match {
case c: HoldsMoney => (createHold(_: HoldsMoney), c: HoldsMoney)
case r: ReserveMoney => (createReserve(_: ReserveMoney), r: ReserveMoney)
})
HoldsMoney
和ReserveMoney
有MoneyType
基本类型。
Scala编译器抛出以下错误。
missing parameter type for expanded function
注意,这个工作如果
x match {
case c: HoldsMoney => sendMoney(createHold(_: HoldsMoney), c)
case r: ReserveMoney => sendMoney(createReserve(_: ReserveMoney), r)
}
不错。但为什么不是常见的类型为'MoneyType => Future [MoneyType]'。他们有一个共同的基类后继 –
@FaizHalde那么,'HoldsMoney <:MoneyType','未来[HoldsMoney] <:未来[MoneyType]'('未来'是协变的),但正如我所提到的'功能'是逆变在它的参数类型中,所以'HoldsMoney => Future [HoldsMoney]'不是'MoneyType => Future [MoneyType]'的子类型。这可能是违反直觉的,但当你考虑它时,它实际上是很自然的。也看到这个问题:http://stackoverflow.com/questions/10603982/why-is-function-a1-b-not-about-allowing-any-supertypes-as-parameters – Kolmar
是的。混乱现在已经清除!谢谢。对我来说似乎是不可能的 –