对于
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
用户,因为只有交易者才能纳税。请问,这种覆盖怎么可能?
答案 0 :(得分:5)
首先,您应该了解错误的原因:自AuthUserObject
扩展val auth: AuthUserObject = HasPaidTax
以来,您可以将此类型归因于此:
auth: AuthUserObject
但对于任何user: User
和auth.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
}