私はこのコードで何が起こっているのかを理解しようとしています。理解できないことがあるかどうか、またはコンパイラのバグや直感的でない仕様であるかどうかを理解しようとしています。これら2つのほぼ同じ関数を定義しましょう。
def typeErause1(a: Any) = a match {
case x: List[String] => "stringlists"
case _ => "uh?"
}
def typeErause2(a: Any) = a match {
case List(_, _) => "2lists"
case x: List[String] => "stringlists"
case _ => "uh?"
}
今、私が電話すると、実際に型消去を使用しても違いがわからないため、typeErause1(List(2,5,6))
取得します。しかし、不思議なことに、電話をかけると、以前のように一致しない理由がわかりません。代わりに2番目の関数を使用すると、正しく一致させることができるため、これはscalacのバグだと思います。"stringlists"
List[Int]
typeErause2(List(2,5,6))
"uh?"
List[String]
List[_]
Scala2.9.1を使用しています