Quando si esegue il modello di corrispondenza di nuovo Elenchi, è possibile utilizzare Nil per verificare la presenza di un elenco vuoto. Tuttavia, se il tipo di fondo è un Iterable, è ancora possibile verificare la presenza di Nil, e si romperà per insieme vuoto, ecc ... Vedi sessione seguente REPL:Come evitare questo tipo di bug - corrispondenza del modello e 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
domanda è - come posso impedire questo tipo di problema? Ovviamente, se l è un elenco di tipi, non è un bug. E se l è di tipo Set, non verrà compilato. Ma se avessimo una classe che ha una lista, definiamo una funzione che il modello corrisponde in questo modo, e poi qualcuno cambia la classe per assumere invece un iter generico? Questo modello Nil vs. _ è in linea con una cattiva idea in generale?
Subtyping è un'arma a doppio taglio; usare con cura. –