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

$

Język programowania Scala Wydanie 2. Copyright © Grzegorz Balcerek 2016

Licencja Creative Commons

Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowe.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.