23.8. Adnotacja implicitNotFound

Adnotacja implicitNotFound pozwala na zdefiniowanie komunikatu, jaki kompilator ma wyświetlać w przypadku, gdy nie potrafi odnaleźć wymaganej wartości przekazywanej niejawnie mającej typ taki, jak oznaczony tą adnotacją.

Plik ImplicitNotFound1.scala:
class Greetings(val greeting: String, val ending: String)
object ImplicitNotFound1 {
  def greet(names: String*)(implicit greetings: Greetings) =
    println(greetings.greeting + " " + names.mkString(", ") + greetings.ending)
  def main(args: Array[String]) = greet("Peter")
}

W pliku ImplicitNotFound1.scala znajduje się program, którego kompilacja nie udaje się z powodu tego, że kompilator nie znajduje wartości przekazywanej niejawnie typu Greetings. Kompilator wyświetla standardowy komunikat błędu.

$ scalac ImplicitNotFound1.scala
ImplicitNotFound1.scala:5: error: could not find implicit value for parameter greetings: Greetings
  def main(args: Array[String]) = greet("Peter")
                                       ^
one error found

W przykładzie z pliku ImplicitNotFound2.scala definicja klasy Greetings jest uzupełniona o adnotację implicitNotFound.

Plik ImplicitNotFound2.scala:
import scala.annotation.implicitNotFound
@implicitNotFound("an implicit Greetings object not found!!!!")
class Greetings(val greeting: String, val ending: String)
object ImplicitNotFound2 {
  def greet(names: String*)(implicit greetings: Greetings) =
    println(greetings.greeting + " " + names.mkString(", ") + greetings.ending)
  def main(args: Array[String]) = greet("Peter")
}

Kompilacja tego programu również nie udaje się, z podobnego powodu, jak w przypadku programu ImplicitNotFound1.scala, ale komunikat błędu wyświetlony przez kompilator zawiera treść zdefiniowaną w adnotacji implicitNotFound.

$ scalac ImplicitNotFound2.scala
ImplicitNotFound2.scala:7: error: an implicit Greetings object not found!!!!
  def main(args: Array[String]) = greet("Peter")
                                       ^
one error found

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.