3

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

ありがとう。

4

1 に答える 1

-1

引数と型パラメーターを使用して呼び出しtestを試みると、次のように表示されます。nullSys[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"
于 2013-02-03T16:53:53.867 に答える