测试隐式转换是否可用

时间:2011-04-19 14:21:20

标签: scala implicit-conversion

我正在尝试检测是否存在隐式转换,并依赖于它来执行某些代码。例如:

if (x can-be-converted-to SomeType)
  return something(conversion(x))
else
  return someotherthing(x)

例如,x是一个Int,应该转换为RichInt。 这可能在Scala中吗?如果是,怎么样?

由于

2 个答案:

答案 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)

请注意,在运行时检查这一点似乎很奇怪,因为编译器在编译时知道这样的转换函数是否可用。