Kiedy ponownie dopasowujesz wzorzec do listy, możesz użyć pustej listy do sprawdzenia pustej listy. Jednakże, jeśli typ bazowy jest iterable, nadal można sprawdzić, Nil, i będzie przerwa na zbiór pusty, itp ... Zobacz następujący REPL sesji:Jak zapobiegać tego rodzaju błędom - dopasowywanie wzorców i zerowanie
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
pytanie brzmi - w jaki sposób można zapobiec tego rodzaju emisyjny? Oczywiście, jeśli l jest listą typów, to nie jest to błąd. A jeśli l jest typu Set, to nie będzie się kompilować. Ale co, jeśli mamy klasę, która ma listę, definiujemy funkcję, która dopasowuje wzorzec w ten sposób, a następnie ktoś zmienia klasę, aby zamiast tego generować iterację? Czy ten wzór Nil kontra _ pasuje ogólnie do złego pomysłu?
Podtyp jest mieczem obosiecznym; używaj ostrożnie. –