Экстрактор: аргументы предполагаемого типа X не соответствуют границам параметра типа метода unapply

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

Спасибо.


person 0__    schedule 03.02.2013    source источник


Ответы (1)


При попытке вызвать test с аргументом null и параметром типа Sys[Any] он сказал, что:

type arguments [Sys[Any]] do not conform to trait Element's type parameter 
  bounds [S <: Sys[S]]

Пробная дисперсия:

trait 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 f: Element.Foo[S] => "ok"
  case _ => "smth else"
}

// test
test(new Element.Foo[Sys[Any]](){})  // "smth else"
test(new Element[Sys[Any]](){})      // "ok"
person idonnie    schedule 03.02.2013