隐式映射使 Char 方法无法编译

Implicit Map makes Char methods not compile

因此,使用此代码,headexists 方法返回的不是 Char,而是 String,因此我不能使用任何 Char 方法。

implicit val mapTest: Map[String, Set[String]] = Map(
    "foo" -> Set("foo")
  )
  val stringTest: String = "test"

  //This don't compile
  stringTest.head.isLetter
  stringTest.exists(_.isLetter)

如果我删除隐含的,它工作正常。如果我将 Map 定义更改为 Map[String, String],它工作正常,但在地图中使用任何 Collection 都无法编译。

有没有办法让它工作?我也尝试在调用 head 后定义 Char 类型,但它仍然失败

不要在隐式范围内公开 mapTest:因为它提供 .apply(key: String): Set[String],所以它被视为隐式转换 String => Set[String]

Anyway implicit conversion should be defined/used with caution, due to readability drawbacks.

Using .head (or .get) is a code smell.

隐式转换可能会导致代码语义发生看似神奇的变化并导致开发人员失去控制,您的示例很好地证明了这一点。出于这个原因,它们通常是 discouraged,我们被建议找到重构代码的方法,尽可能不使用它们。

如果没有办法解决它,请考虑通过将隐式转换 "out-of-scope" 包装在另一个对象中来移动它

object FooImplicits {
  implicit def mapTest: Map[String, Set[String]] = Map(
    "foo" -> Set("foo")
  )
}

然后尽量避免在顶层导入它们,而是 import FooImplicits._ 只在绝对必要的地方导入。

请注意,在定义 类型类 扩展方法 .

时,隐式是 acceptable