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 的类型相同,因此如果 A
是 Summable
,那么我们希望 +
起作用仅当 that
是 A
类型而不是任何其他 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)
}
我正在尝试以有意义的方式定义以下特征
trait Summable {
def +(that: Summable): Summable
}
但我希望 that 的类型与 this 的类型相同,因此如果 A
是 Summable
,那么我们希望 +
起作用仅当 that
是 A
类型而不是任何其他 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)
}