我正在尝试检测是否存在隐式转换,并依赖于它来执行某些代码。例如:
if (x can-be-converted-to SomeType)
return something(conversion(x))
else
return someotherthing(x)
例如,x是一个Int,应该转换为RichInt。 这可能在Scala中吗?如果是,怎么样?
由于
答案 0 :(得分:11)
正如其他人已经提到过的implicits在编译时解决了所以也许您应该使用类型类来解决这样的问题。这样,您就可以在以后将功能扩展到其他类型。
此外,您可以只需要一个现有的隐式值,但除了默认参数外无法直接表示不存在隐式值。
Jean-Phiippe使用默认参数的解决方案已经相当不错了,但如果定义一个可以代替隐含参数的单例,则可以消除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
答案 1 :(得分:9)
您可以尝试将其传递给需要相应隐式参数且默认值为null
的方法:
def toB[A](a: A)(implicit convertFct: A => B = null) =
if (convertFct != null)
convertFct(a)
else
someOtherThing(a)
请注意,在运行时检查这一点似乎很奇怪,因为编译器在编译时知道这样的转换函数是否可用。