因此,使用此代码,head
和exists
方法未返回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
类型,但仍然失败
不要在隐式范围内公开mapTest
:由于它提供.apply(key: String): Set[String]
,因此被视为隐式转换String => Set[String]
。
由于易读性方面的原因,无论如何都要隐式定义/使用隐式转换。
使用
.head
(或.get
)是一种代码气味。
隐式转换可能会导致对代码语义的看似神奇的更改,并导致开发人员失去控制,您的示例很好地说明了这一点。因此,它们通常是discouraged,建议我们尽可能地重构代码以不使用它们。
如果无法解决,请考虑将隐式转换“包裹在外部”,方法是将其包装在另一个对象中,例如这样
object FooImplicits {
implicit def mapTest: Map[String, Set[String]] = Map(
"foo" -> Set("foo")
)
}
然后尝试避免将它们导入顶层,而仅在绝对必要的情况下才使用import FooImplicits._
。
注意,在定义typeclasses和extension方法时隐式是可接受的。