ในตัวอย่างต่อไปนี้ 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-bound ออก มันก็ใช้งานได้:
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 _ => ???
}
ฉันเดาว่านี่เป็นหนึ่งใน "วันแห่งความเกลียดชังสกาลา" นี่มันโง่ขนาดนี้เลยเหรอ? โดยพื้นฐานแล้วจะเหมือนกับ คำถามนี้ ซึ่งไม่มีคำตอบที่ถูกต้อง
ขอบคุณ.