Посмотрите на этот код.
trait SomeMix {
}
trait Processor[T] {
def processMix(t: T with SomeMix) = {
println("processing T with Mix")
}
def processAsUsual(t:T)= {
println("processing T")
}
def process(t:T) = {
t match {
case mix: SomeMix => processMix(mix) // <---- error here
case _ => processAsUsual(t)
}
}
}
Глупый компилятор Scala показывает ошибку здесь:
Ошибка: (22, 39) несоответствие типов;найдено: mix.type (с базовым типом SomeMix) требуется: T с SomeMix case mix: SomeMix => processMix (mix)
Он не понимает, что выражение I, совпадающее с SomeMix, уже имеет тип TХорошо, давайте поможем ему.Измененный код:
def process(t:T) = {
t match {
case mix: T with SomeMix => processMix(mix) // <---- warning here
case _ => processAsUsual(t)
}
}
Теперь он согласен с тем, что все правильно, но показывает предупреждение:
Предупреждение: (22, 17) шаблон абстрактного типа T не проверяется, поскольку он устраняетсяСочетание случая стирания: T с SomeMix => processMix (mix)
Есть ли какой-нибудь хороший способ избежать здесь ошибок и предупреждений?