Как уже упоминалось, другие последствия разрешаются во время компиляции, поэтому, возможно, вам лучше использовать классы типов для решения подобных проблем. Таким образом, вы получаете преимущество, заключающееся в том, что позже вы можете расширить функциональность на другие типы.
Также вы можете просто потребовать существующее неявное значение, но не можете напрямую выразить несуществование неявного значения, кроме аргументов по умолчанию.
Решение Жана-Филиппа, использующее аргумент по умолчанию, уже довольно хорошо, но null
может быть исключено, если вы определите синглтон, который можно поместить вместо неявного параметра. Сделайте его закрытым, потому что он фактически бесполезен в другом коде и даже может быть опасным, поскольку неявные преобразования могут происходить неявно.
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