scala - 如何用 mixin 实现 F 有界多态性?

标签 scala polymorphism mixins

假设我有一个混合特征,我想定义一个方法,其返回类型取决于该特征混合到的对象的最终类型...

trait MultiUnit extends Quantity {
  this: Order =>

  def split(unmatchedQuantity: Long): (???, ???)

}

...例如,如果我有一个混合在 MultiUnit 中的案例类,我希望返回类型如下所示...

case class MultiUnitLimitOrder(price: Double, quantity: Long) extends Order with MultiUnit {

  def split(unmatchedQuantity: Long): (MultiUnitLimitOrder, MultiUnitLimitOrder) = ???

}

...如果可能的话,我更喜欢使用类型成员而不是类型参数的解决方案。

最佳答案

我不会像你上面建议的那样使用抽象类型成员,f有界是正确的方法。如果您事先不知道 T 的类型(例如您正在计算类型),则该类型成员模式非常有用。当您请求隐式证据时,Shapeless 始终使用该模式,例如:

def test[Computed]()(implicit gen: Generic.Aux[Source, Computed]): Result[Computed] = {}

这用于将 Generic 类内的内部类型成员的值“传输”到 Compulated(上面的类型参数)。

就您而言,除非绝对必要,否则请保持简单。

trait Order
trait Quantity

trait MultiUnit[T <: MultiUnit[T]] extends Quantity {
  this: Order =>

  def split(unmatchedQuantity: Long): (T, T)
}

case class MultiUnitLimitOrder(price: Double, quantity: Long) 
  extends Order with MultiUnit[MultiUnitLimitOrder] {
    override def split(unmatchedQuantity: Long): (MultiUnitLimitOrder, MultiUnitLimitOrder) = ???
}

我也不明白为什么您需要为 this: Order 绑定(bind)一个 self-type 而不是简单的 with Order

关于scala - 如何用 mixin 实现 F 有界多态性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41095283/

相关文章:

javascript - 试图理解以工厂和基于函数的混合技术为特征的对象组合模式

swift - 我可以在 Swift 中模拟 traits/mixins 吗?

scala - com.earldouglas#xsbt-web-plugin 在哪里发布?

Scala 元组列表到平面列表

C++ 转换自定义类的非指针实例

java - 当基类被重写时,如何从另一个方法调用基类自己的方法?

c++ - C++ 虚函数总是在运行时解析吗?

Python + mypy + mixin = has no attribute 报错

scala - 包含子字符串列表中的确切子字符串的字符串

scala - 如何解决 eclipse 2019 中的 Scala 错误?