Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 避免隐式参数变成隐式转换_Scala_Implicit Conversion_Implicit_Implicits_Scala Implicits - Fatal编程技术网

Scala 避免隐式参数变成隐式转换

Scala 避免隐式参数变成隐式转换,scala,implicit-conversion,implicit,implicits,scala-implicits,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

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
调用是类型
Int
的合成方法
toInt
,而不是
StringOps
提供的
toInt
方法


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

将隐式
映射
封装在一个case类中。这只是不使用隐式作用域作为隐藏数据位置的众多原因之一。我在这里与Travis站在一起。不要像DI容器那样简单地使用隐式参数向您传递参数。当标准库和流行库都使用隐式作用域作为配置源时,很难说服人们不使用隐式作用域作为配置源(
ExecutionContext
Actormatarializer
,…)。通常,折衷方法是仅为您拥有的某个非常特定的类型定义隐式。