假设我有一个混合特征,我想定义一个方法,其返回类型取决于该特征混合到的对象的最终类型...
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/