Alb*_*ard 9 scala implicit-conversion
我试图检测是否存在隐式转换,并依赖于它来执行一些代码.例如 :
if (x can-be-converted-to SomeType)
return something(conversion(x))
else
return someotherthing(x)
Run Code Online (Sandbox Code Playgroud)
例如,x是一个Int,应该转换为RichInt.这可能在Scala中吗?如果有,怎么样?
谢谢
Mor*_*itz 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
Run Code Online (Sandbox Code Playgroud)
您可以尝试将其传递给需要相应隐式参数的方法,默认值为null:
def toB[A](a: A)(implicit convertFct: A => B = null) =
if (convertFct != null)
convertFct(a)
else
someOtherThing(a)
Run Code Online (Sandbox Code Playgroud)
请注意,在运行时检查此内容似乎很奇怪,因为编译器在编译时知道这样的转换函数是否可用.