Cuando el patrón coincide nuevamente Listas, puede usar Nil para verificar si hay una lista vacía. Sin embargo, si el tipo subyacente es un Iterable, todavía se puede comprobar por Nil, y se romperá para los conjuntos vacíos, etc ... Ver siguiente sesión REPL:Cómo evitar este tipo de error - coincidencia de patrones y Nil
scala> val l: Iterable[Int] = List()
l: Iterable[Int] = List()
scala> l match {
| case Nil => 1
| case _ => 2
| }
res0: Int = 1
scala> val l: Iterable[Int] = Set()
l: Iterable[Int] = Set()
scala> l match {
| case Nil => 1
| case _ => 2
| }
res2: Int = 2
La pregunta es - ¿cómo puedo evitar que este tipo de problema? Obviamente, si l es un tipo List, no es un error. Y si l es de tipo Set, no se compilará. Pero, ¿y si tenemos una clase que tiene una lista, definimos una función que coincide con el patrón de esta manera, y luego alguien cambia la clase para tomar un iterable genérico en su lugar? ¿Es este patrón Nil vs. _ una mala idea en general?
Subtipo es una espada de doble filo; usar con cuidado –