Scala:为什么类型转换隐式会破坏代码
Scala: why type conversion implicit breaks the code
我有一个简单的代码
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 类型的行中冒出来
隐式转换太多。尝试
private def convertFieldsNames (fieldsNames: Array[String]): Array[String] =
(fieldsNames: ArrayOps[String]).map(convertFieldName)
编译器选择了错误的转换 Array[String] => Either[String, Array[String]]
而不是 Array[String] => ArrayOps[String]
,因为 .map
不仅可以是 Array#map
,还可以是 Either#map
。并且类型 inference/type 检查有效,因此当出现类型不匹配错误时,回来选择适当的隐式转换为时已晚。
我有一个简单的代码
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 类型的行中冒出来
隐式转换太多。尝试
private def convertFieldsNames (fieldsNames: Array[String]): Array[String] =
(fieldsNames: ArrayOps[String]).map(convertFieldName)
编译器选择了错误的转换 Array[String] => Either[String, Array[String]]
而不是 Array[String] => ArrayOps[String]
,因为 .map
不仅可以是 Array#map
,还可以是 Either#map
。并且类型 inference/type 检查有效,因此当出现类型不匹配错误时,回来选择适当的隐式转换为时已晚。