Scala:强制某些函数的类型在特征中使用 this 的类型

Scala : Force the type of some function to use the type of this in a trait

我正在尝试以有意义的方式定义以下特征

trait Summable {
    def +(that: Summable): Summable
}

但我希望 that 的类型与 this 的类型相同,因此如果 ASummable,那么我们希望 + 起作用仅当 thatA 类型而不是任何其他 Summable.

类型时

我在文档中找不到这样做的方法,如果有人有任何想法或文档我可以阅读,我会很高兴。

您正在寻找 F 绑定多态性

trait Summable[A <: Summable[A]] { self: A =>
    def +(that: A): A
}

现在,您可以创建如下所示的具体实现,

class IntSummable(val i: Int) extends Summable[IntSummable] {
  override def +(that: IntSummable): IntSummable = new IntSummable(this.i + that.i)
}

val is1 = new IntSummable(5)
val is2 = new IntSummable(10)

val is3 = is1 + is2

但是像下面这样的东西不会编译,

class DoubleInvalidSummable1(val d: Double) extends Summable[DoubleInvalidSummable1] {
  override def +(that: IntSummable): DoubleInvalidSummable1 = new DoubleInvalidSummable1(this.d + that.i)
}