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.