Я пытаюсь понять, что происходит на этом фрагменте кода, пытаясь выяснить, есть ли что-то, чего я не понимаю, или это ошибка компилятора или неинтуитивная спецификация, давайте определим эти две почти идентичные функции:
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))
Я получаю "stringlists"
, потому что даже если это на самом деле List[Int]
с стиранием типа, он не может отличить . Но странно, если я вызываю typeErause2(List(2,5,6))
, я получаю "а?"
и не понимаю, почему это не соответствует List[ Строка]
как раньше. Если я использую List[_]
вместо второй функции, она сможет правильно сопоставить ее, что заставляет меня думать, что это ошибка в scalac.
Я использую Scala 2.9.1