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: AuthUserObject
和 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
}
对于
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: AuthUserObject
和 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
}