首页 > 解决方案 > Scala:为什么类型转换隐式会破坏代码

问题描述

我有一个简单的代码

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)

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

implicit def fromStringToEitherStringOrArray (str: String): Either[String, Array[String]] = Left(str)
implicit def fromArrayToEitherStringOrArray (arr: Array[String]): Either[String, Array[String]] = Right(arr)

我在一行中遇到错误

fieldsNames.map(convertFieldName)

type mismatch;
 found   : String => String
 required: Array[String] => ?

我预计这些转换只有在需要转换为 Either 值时才会生效,所以我不明白为什么这个错误会在根本没有 Either 类型的行中冒泡

标签: scalaimplicit-conversionimplicit

解决方案


只是太多的隐式转换。尝试

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

编译器选择了错误的转换Array[String] => Either[String, Array[String]]而不是Array[String] => ArrayOps[String]因为.mapcan be not Array#mapbut also Either#map. 并且类型推断/类型检查有效,因此当出现类型不匹配错误时,回来选择适当的隐式转换为时已晚。


推荐阅读