Избегайте неявных параметров, превращающихся в неявные преобразования

Предполагаемый вывод следующего кода является цифрой, 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 вызывая неявный параметр, предоставленный doWork, massTable, чтобы также и непреднамеренно функционировать как неявное преобразование из String => Int,

Результатом является то, что выше toInt вызов это синтетический метод toInt для типа Int, а не toInt метод предоставлен StringOps,

Каков наилучший способ избежать такого рода проблем и достичь желаемого результата?

0 ответов

Другие вопросы по тегам