的,我有以下代碼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
是的。混亂現在已經清除!謝謝。對我來說似乎是不可能的 –