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 の特性 AuthUserObject でメソッド authorize をオーバーライドしています。メソッド authorize には互換性のない型があります def authorize[T <: Trader](t: T): Boolean ^

トレーダーのみが税金を支払うため、ユーザーに限定AuthTraderObjectする必要があります。Traderこのオーバーライドはどのように可能ですか?

4

2 に答える 2

5

まず、エラーの理由を理解する必要があります。HasPaidTaxextendsAuthUserObjectであるため、この型をそれに帰することができます。

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 に答える