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

时间:2016-09-17 12:52:48

标签: scala traits context-bound

对于

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
}

这不构建。错误:

  

错误:(15,7)覆盖方法授权特征[U&lt ;: users.User](u:U)布尔值的特征AuthUserObject;   方法授权具有不兼容的类型    def authorize [T&lt;:Trader](t:T):布尔值         ^

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

2 个答案:

答案 0 :(得分:5)

首先,您应该了解错误的原因:自AuthUserObject扩展val auth: AuthUserObject = HasPaidTax 以来,您可以将此类型归因于此:

auth: AuthUserObject

但对于任何user: Userauth.authorize(user),您都可以致电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 } 。因此,当重写方法时,不能缩小参数类型或键入边界。

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

{{1}}

答案 1 :(得分:4)

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

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
}