Scala:为什么类型转换隐式破坏代码

Dmi*_*tov 1 scala implicit implicit-conversion

我有一个简单的代码

private def convertFieldsNames (fieldsNames: Array[String]): Array[String] =
  fieldsNames.map(convertFieldName)

private def convertFieldName (fieldName: String): String = s"!!! $fieldName"

val res = convertFieldsNames(Array("123", "456"))
res.map(println)
Run Code Online (Sandbox Code Playgroud)

它工作正常,但是当我添加类型转换功能时,我将在其他功能中使用

implicit def fromStringToEitherStringOrArray (str: String): Either[String, Array[String]] = Left(str)
implicit def fromArrayToEitherStringOrArray (arr: Array[String]): Either[String, Array[String]] = Right(arr)
Run Code Online (Sandbox Code Playgroud)

我一行出现错误

fieldsNames.map(convertFieldName)

type mismatch;
 found   : String => String
 required: Array[String] => ?
Run Code Online (Sandbox Code Playgroud)

我希望这些转换仅在需要转换为Either值时才会生效,所以我无法理解为什么此错误在根本没有Either类型的行中冒出

Dmy*_*tin 5

太多的隐式转换。尝试

private def convertFieldsNames (fieldsNames: Array[String]): Array[String] =
  (fieldsNames: ArrayOps[String]).map(convertFieldName)
Run Code Online (Sandbox Code Playgroud)

编译器选择错误的转换Array[String] => Either[String, Array[String]]不是Array[String] => ArrayOps[String]因为.map不仅可以,Array#map而且还可以Either#map。而且类型推断/类型检查的工作原理是,当出现类型不匹配错误时,现在回来选择适当的隐式转换为时已晚。

  • 也可以通过不为两个非常常见的基本类型(数组和字符串)添加此新隐式对象来解决。如果您不仔细调整范围,它将破坏整个地方的其他内容。为什么不仅仅具有显式的函数调用来转换它(或者直接调用`Left`或`Right`)? (3认同)