В следующем примере Scala не может использовать экстрактор, и это сводит меня с ума:
trait Sys[S <: Sys[S]]
object Element {
object Foo {
def unapply[S <: Sys[S]](foo: Foo[S]): Option[Any] = ???
}
trait Foo[S <: Sys[S]] extends Element[S]
}
trait Element[S <: Sys[S]]
Это тестовый пример:
def test[S <: Sys[S]](elem: Element[S]) = elem match {
case Element.Foo(_) => ???
case _ => ???
}
Неудача с
inferred type arguments [S] do not conform to method unapply's type parameter
bounds [S <: Sys[S]]
(как в Scala 2.9.2, так и в 2.10).
Если я уберу F-связку, это сработает:
trait Sys
object Element {
object Foo {
def unapply[S <: Sys](foo: Foo[S]): Option[Any] = ???
}
trait Foo[S <: Sys] extends Element[S]
}
trait Element[S <: Sys]
def test[S <: Sys](elem: Element[S]) = elem match {
case Element.Foo(_) => ???
case _ => ???
}
Я предполагаю, что это один из тех "дней ненависти к Scala". Неужели это так глупо? В основном это то же самое, что и этот вопрос , на который нет правильного ответа.
Спасибо.