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

问题描述 投票:0回答:2

因此,使用此代码,headexists方法未返回Char,但返回的是字符串,因此我无法使用任何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[String, String],则效果很好,但是在地图中使用任何Collection都无法编译。

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

scala implicit
2个回答
0
投票

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

由于易读性方面的原因,无论如何都要隐式定义/使用隐式转换。

使用.head(或.get)是一种代码气味。


0
投票

隐式转换可能会导致对代码语义的看似神奇的更改,并导致开发人员失去控制,您的示例很好地说明了这一点。因此,它们通常是discouraged,建议我们尽可能地重构代码以不使用它们。

如果无法解决,请考虑将隐式转换“包裹在外部”,方法是将其包装在另一个对象中,例如这样

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

然后尝试避免将它们导入顶层,而仅在绝对必要的情况下才使用import FooImplicits._

注意,在定义typeclassesextension方法时隐式是可接受的。

© www.soinside.com 2019 - 2024. All rights reserved.