避免隐式参数成为隐式转换

时间:2017-01-05 23:59:23

标签: scala implicit-conversion implicit implicits scala-implicits

以下代码的预期输出是数字0

object Bad extends App {
  implicit val massTable: Map[String, Int] =
    Map("H" -> 1, "He" -> 4, "O" -> 16)

  Implementation.doWork()
}

object Implementation {
  def doWork()(implicit massTable: Map[String, Int]) = println("0".toInt)
}

实际输出是个例外:

java.util.NoSuchElementException: key not found: 0
at scala.collection.immutable.Map$Map3.apply(Map.scala:156)
at Implementation$.doWork(Main.scala:20)
at Bad$.delayedEndpoint$Bad$1(Main.scala:16)
...

调查显示Map实施apply(string): Int导致提供给doWorkmassTable的隐式参数也无意中充当String => Int的隐式转化

结果是,上述toInt调用是类型toInt的合成方法Int,而不是toInt提供的StringOps方法

避免此类问题并获得所需输出的最佳方法是什么?

0 个答案:

没有答案