2016-09-17 2 views
1

ДляScala - Перекрытие метод черты используя вспомогательный контекст, связанный метод

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 пользователю, так как только трейдер платит налог. Пожалуйста, как это возможно?

ответ

5

Во-первых, вы должны понять причину ошибки: поскольку 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 
} 
4

тип пользователя, а затем переопределить тип, когда necessory

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 
} 
+0

Использование 'типа U <: User' будет представлять его как 'AuthUserObject.this.U'. Будет работать в явных случаях. Но не работает с абстрактными методами абстрактного класса или признака верхнего типа, ограниченного 'trait Authorizer [U <: User]' – Orar

Смежные вопросы