Comme d'autres implicits déjà mentionnés sont résolus au moment de la compilation, vous devriez peut-être plutôt utiliser des classes de types pour résoudre des problèmes comme celui-ci. De cette façon, vous avez l'avantage de pouvoir étendre les fonctionnalités à d'autres types plus tard.
Vous pouvez également simplement demander une valeur implicite existante, mais vous n'avez aucun moyen d'exprimer directement la non-existence d'une valeur implicite, à l'exception des arguments par défaut.
La solution de Jean-Phiippe utilisant un argument par défaut est déjà assez bonne mais le null
pourrait être éliminé si vous définissiez un singleton qui peut être mis à la place du paramètre implicite. Rendez-le privé car il n'est en fait d'aucune utilité dans un autre code et peut même être dangereux car des conversions implicites peuvent se produire implicitement.
private case object NoConversion extends (Any => Nothing) {
def apply(x: Any) = sys.error("No conversion")
}
// Just for convenience so NoConversion does not escape the scope.
private def noConversion: Any => Nothing = NoConversion
// and now some convenience methods that can be safely exposed:
def canConvert[A,B]()(implicit f: A => B = noConversion) =
(f ne NoConversion)
def tryConvert[A,B](a: A)(implicit f: A => B = noConversion): Either[A,B] =
if (f eq NoConversion) Left(a) else Right(f(a))
def optConvert[A,B](a: A)(implicit f: A => B = noConversion): Option[B] =
if (f ne NoConversion) Some(f(a)) else None
Les conversions implicites n'existent qu'au moment de la compilation et non au moment de l'exécution. Si vous voulez tester si une telle conversion existe, vous pouvez écrire le code et essayer de le compiler. Le compilateur vous dira s'il peut être compilé. – sschaef