我有以下代码
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)
}
答案 0 :(得分:3)
考虑
的类型x match {
case c: HoldsMoney => (createHold(_: HoldsMoney), c: HoldsMoney)
case r: ReserveMoney => (createReserve(_: ReserveMoney), r: ReserveMoney)
}
createHold(_: HoldsMoney)
的类型为HoldsMoney => Future[HoldsMoney]
,createReserve(_: ReserveMoney)
的类型为ReserveMoney => Future[ReserveMoney]
。
因为函数在其参数类型中是逆变的,所以这两个函数的通用类型只能是Nothing => Future[MoneyType]
。因此整个match
的类型是(Nothing => Future[MoneyType], MoneyType)
,它不符合sendMoney
的参数类型。
所以问题是对于sendMoney
的不同组合的参数,不可能有一个合适的公共类型。
答案 1 :(得分:0)
我认为您的目标是为sendMoney
重构参数创建并使用tupled
传递它们。
我想你的代码缺少部分,并为简单起见删除了类型边界。
def sendMoney(fn: (MoneyType) => Future[MoneyType], input: MoneyType): Unit = println("sendMoney")
def createHold(moneyType: MoneyType): Future[MoneyType] = ???
def createReserve(moneyType: MoneyType): Future[MoneyType] = ???
(sendMoney _).tupled(x match {
case c: HoldsMoney => (createHold, c)
case r: ReserveMoney => (createReserve, r)
})