Scala - 使用子上下文绑定方法覆盖特征方法

Scala - Overriding trait method using a sub context bound method

对于

sealed trait User {...}
sealed trait Trader extends User {...}

trait AuthObject

trait AuthUserObject {
  def authorize[U <: User](u: U): Boolean
}

trait AuthTraderObject extends AuthUserObject {
  def authorize[T <: Trader](t: T): Boolean
}

object HasPaidTax extends AuthTraderObject {
  def authorize[T <: Trader](t: T): Boolean = t.hasPaidTax
}

这没有建立。错误:

Error:(15, 7) overriding method authorize in trait AuthUserObject of type [U <: users.User](u: U)Boolean; method authorize has incompatible type def authorize[T <: Trader](t: T): Boolean ^

我需要将 AuthTraderObject 限制为 Trader 用户,因为只有交易者纳税。请问,这个覆盖是怎么可能的?

用户类型,然后在需要时覆盖类型

trait User

trait Trader extends User


trait AuthUserObject {
  type U <: User
  def authorize(u: U): Boolean
}

trait AuthTraderObject extends AuthUserObject {
  override type U <: Trader
  override def authorize(u: U): Boolean
}

首先,你应该明白错误的原因:因为HasPaidTax扩展了AuthUserObject,你可以把这个类型归于它:

val auth: AuthUserObject = HasPaidTax

但对于任何 auth: AuthUserObjectuser: User,您可以调用 auth.authorize(user)。所以当覆盖方法时,你不能缩小参数类型或类型范围。

对于解决方案,您可以使用 pamu 的答案或将类型参数移动到类型(对于这种情况应该是等效的):

trait AuthUserObject[U <: User] {
    def authorize(u: U): Boolean
}

trait AuthTraderObject[T <: Trader] extends AuthUserObject[T] {
    def authorize(t: T): Boolean
}

object HasPaidTax extends AuthTraderObject[Trader] {
    def authorize(t: Trader): Boolean = t.hasPaidTax
}