Scala 内部 class 泛型边界

Scala inner class generic bounds

我有与此类似的外部 API 设置:

abstract class PE {
  type Event

  abstract class C[R] {
    def reply(r: R)
    def persist[B <: Event](e: B)(callback: B => Unit): Persist
    def fail(error: Throwable): Persist
  }
  abstract class Persist {
    // ...
  }
}

我想基于 scala 的 Try class 创建一个更像函数式的包装器。我想出了以下代码:

def tryPersist[P <: PE, E <: P#Event, R](c: PE#C[R], tryEvent: Try[E])(replyProducer: E => R): PE#Persist = {
    tryEvent match {
        case Success(event) =>
            c.persist(event)(_ => c.reply(replyProducer(event)))
        case Failure(exception) =>
            c.fail(exception)
    }
  }

但是,这不起作用,因为 Scala 拒绝接受 PE#Persist 作为 PE.this.Persist。是不是少了什么?

inferred type arguments [E] do not conform to method persist's type parameter bounds [B <: _1.Event] c.persist(event)(_ => c.reply(replyProducer(event)))

并在通话地点:

[error]  found   : MyPEImpl#Persist
[error]  required: MyPEImpl.this.Persist
[error]                     persistEvent(ctx, command.eventFor(state))(_.playerBet)

PS:如果有人注意到,是的,它是 Lagom PersistentEntity 的 API

这失败了,因为 PE.this.PersistPE#Persist 的子类型,因此您试图传递需要特定子类型的超类型。

当类型像这样嵌套时,Scala 会为封闭 class 的每个实例创建一个新的嵌套类型。因此,使用 PE 的一个实例创建的 Persist 实例与使用 PE 的不同实例创建的 Persist 实例不兼容。符号 PE#Persist 表示所有不同 PE.this.Persist 类型的超类型。