Ekstraktor: argumen tipe yang disimpulkan X tidak sesuai dengan batasan parameter tipe metode unapply

Dalam contoh berikut, Scala tidak dapat menggunakan ekstraktor, dan ini membuat saya gila:

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]]

Ini adalah kasus uji:

def test[S <: Sys[S]](elem: Element[S]) = elem match {
  case Element.Foo(_) => ???
  case _ => ???
}

Gagal dengan

inferred type arguments [S] do not conform to method unapply's type parameter
  bounds [S <: Sys[S]]

(baik di Scala 2.9.2 dan 2.10).


Jika saya menghapus F-bound itu berfungsi:

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 _ => ???
}

Saya kira ini adalah salah satu "hari kebencian Scala". Bisakah ini sebodoh itu? Pada dasarnya sama dengan pertanyaan ini , yang tidak memiliki jawaban yang tepat.

Terima kasih.


person 0__    schedule 03.02.2013    source sumber


Jawaban (1)


Saat mencoba memanggil test dengan argumen null dan parameter tipe Sys[Any], dikatakan bahwa:

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

Mencoba varians:

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