次の例では、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嫌いの日」の1つだと思います。これはとてもばかげていることができますか?基本的には、この質問と同じで、適切な回答がありません。
ありがとう。