J'aimerais remplacer le message standard "implicit not found" (implicite non trouvé) lors de l'utilisation de la fonction =:=
dans l'exemple suivant :
sealed trait TBoolean
sealed trait TTrue extends TBoolean
sealed trait TFalse extends TBoolean
class Builder[X <: TBoolean, Y <: TBoolean, Z <: TBoolean] private(x: Int, y: Int, z: List[List[Int]]) {
protected def this() = this(-1, -1, List.empty)
def withX(xx: Int)(implicit ev: X =:= TFalse) = new Builder[TTrue, Y, Z](xx, this.y, this.z)
def withY(yy: Int)(implicit ev: Y =:= TFalse) = new Builder[X, TTrue, Z](this.x, yy, this.z)
def withZ(zz: List[List[Int]])(implicit ev: Z =:= TFalse) = new Builder[X, Y, TTrue](this.x, this.y, zz)
def build()(implicit ev1: Y =:= TTrue, ev2: X =:= TTrue, ev3: Z =:= TTrue) = println(s"${x} ${y} ${z}")
}
object Builder {
def apply() = new Builder[TFalse, TFalse, TFalse]
}
Si j'essaie de construire un objet illégal comme celui-ci :
Builder().withX(1).withY(1).withZ(List.empty).withY(1).build // i.e. two withY calls
Je reçois les réponses habituelles :
error: Cannot prove that TTrue =:= TFalse.
Je souhaite personnaliser ce message pour qu'il soit plus informatif. J'ai essayé d'utiliser @scala.annotation.implicitNotFound("custom message: blah")
mais cela ne semble pas fonctionner.
Existe-t-il un moyen de le faire ?