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