Смешивание типизированных совпадений с сопоставлением последовательностей приводит к странному поведению в Scala

Я пытаюсь понять, что происходит на этом фрагменте кода, пытаясь выяснить, есть ли что-то, чего я не понимаю, или это ошибка компилятора или неинтуитивная спецификация, давайте определим эти две почти идентичные функции:

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

6
задан Community 19 May 2012 в 14:44
поделиться