我已经阅读了几篇文章,表示应该使用抽象类型来实现 Scala 中的 f 有界多态性。这主要是为了缓解类型推断问题,但也是为了消除在定义递归类型时类型参数似乎引入的二次增长。
这些定义如下:
trait EventSourced[E] {
self =>
type FBound <: EventSourced[E] { type FBound <: self.FBound }
def apply(event: E): FBound
}
但是,这似乎引入了两个问题:
1) 每次用户想要引用该类型的对象时,他们还必须引用FBound
类型参数。这感觉就像代码气味:
def mapToSomething[ES <: EventSourced[E], E](eventSourced: ES#FBound): Something[ES, E] = ...
2) 编译器现在无法推断上述方法的类型参数,失败并显示以下消息:
Type mismatch, expected: NotInferredES#FBound, actual: MyImpl#FBound
有没有人在他们的解决方案中成功实现了 f 有界多态性,从而编译器仍然能够推断类型?