23.6. Adnotacja unchecked
Kompilator języka Scala może sprawdzać kompletność wzorców używanych w klauzulach case wyrażenia match. Kompilacja programu z pliku UncheckedHello1.scala powoduje wystąpienie ostrzeżenia, gdyż wzorce nie pokrywają wszystkich teoretycznych możliwości.
Plik UncheckedHello1.scala: abstract sealed class Person(name: String) case class Man(name: String) extends Person(name) case class Woman(name: String) extends Person(name) object UncheckedHello extends App { private def sayHello(person: Person) = person match { case Man(name) => println("Hello Mr. "+name+"!") } sayHello(Man("Peter")) }
Scala wykrywa niekompletność klauzul case w metodzie sayHello. Chodzi o to, że klasa Person ma dwie podklasy: Man i Woman, a w metodzie sayHello obsługiwany jest tylko przypadek klasy Man.
$ scalac UncheckedHello1.scala
UncheckedHello1.scala:5: warning: match may not be exhaustive.
It would fail on the following input: Woman(_)
private def sayHello(person: Person) = person match {
^
one warning found
Komunikat kompilatora informuje o pominiętej klasie Woman. W
przypadku tego akurat programu klauzula sprawdzająca przypadek klasy
Woman nie jest jednak potrzebna, gdyż metoda sayHello wywoływana
jest tylko raz i tylko z argumentem będącym obiektem klasy Man. To
ostrzeżenie można wyeliminować przez dodanie do kodu adnotacji
unchecked. Adnotacją należy opatrzyć wyrażenie znajdujące się przed
słowem kluczowym match. W pliku UncheckedHello2.scala znajduje się
zmieniona wersja programu. Adnotacja została dodana w wierszu
.
Plik UncheckedHello2.scala: abstract sealed class Person(name: String) case class Man(name: String) extends Person(name) case class Woman(name: String) extends Person(name) object UncheckedHello extends App { private def sayHello(person: Person) = (person: @unchecked) match {
case Man(name) => println("Hello Mr. "+name+"!") } sayHello(Man("Peter")) }
Program z pliku UncheckedHello2.scala kompiluje się bez ostrzeżeń ze strony kompilatora.
$ scalac UncheckedHello2.scala $
Plik UncheckedHello1.scala:
abstract sealed class Person(name: String)
case class Man(name: String) extends Person(name)
case class Woman(name: String) extends Person(name)
object UncheckedHello extends App {
private def sayHello(person: Person) = person match {
case Man(name) => println("Hello Mr. "+name+"!")
}
sayHello(Man("Peter"))
}
