1

为了

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 <: users.User](u: U)Boolean 类型的 trait AuthUserObject 中覆盖方法授权;方法授权具有不兼容的类型 def authorize[T <: Trader](t: T): Boolean ^

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

4

2 回答 2

5

首先,您应该了解错误的原因:由于HasPaidTaxextends AuthUserObject,您可以将这种类型归因于它:

val auth: AuthUserObject = HasPaidTax

但是对于任何auth: AuthUserObjectand user: 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
}
于 2016-09-17T14:02:38.933 回答
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
}
于 2016-09-17T13:08:23.260 回答