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.Persist
是 PE#Persist
的子类型,因此您试图传递需要特定子类型的超类型。
当类型像这样嵌套时,Scala 会为封闭 class 的每个实例创建一个新的嵌套类型。因此,使用 PE
的一个实例创建的 Persist
实例与使用 PE
的不同实例创建的 Persist
实例不兼容。符号 PE#Persist
表示所有不同 PE.this.Persist
类型的超类型。
我有与此类似的外部 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.Persist
是 PE#Persist
的子类型,因此您试图传递需要特定子类型的超类型。
当类型像这样嵌套时,Scala 会为封闭 class 的每个实例创建一个新的嵌套类型。因此,使用 PE
的一个实例创建的 Persist
实例与使用 PE
的不同实例创建的 Persist
实例不兼容。符号 PE#Persist
表示所有不同 PE.this.Persist
类型的超类型。