scala - 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 类型的行中冒泡
解决方案
只是太多的隐式转换。尝试
private def convertFieldsNames (fieldsNames: Array[String]): Array[String] =
(fieldsNames: ArrayOps[String]).map(convertFieldName)
编译器选择了错误的转换Array[String] => Either[String, Array[String]]
而不是Array[String] => ArrayOps[String]
因为.map
can be not Array#map
but also Either#map
. 并且类型推断/类型检查有效,因此当出现类型不匹配错误时,回来选择适当的隐式转换为时已晚。
推荐阅读
- ios - Swift 4:UIView 子类化,获取父视图
- angular - 无法在 asp.net core angular 中将值从角度服务发布到 Web API
- sql-server - MSSQL-Query:如果列中的所有值都为空,则返回结果
- rabbitmq - 如何使用 Spring Cloud Stream binder 发送优先级消息
- java - 如何在现有 AEM Quickstart JAR 中添加运行状况端点?
- python-3.x - python:显示列表中的唯一元素
- javascript - 如何禁用 Telerik 验证?
- html - 使用python创建html文档
- javascript - 如何在 c3 分组条形图上固定 Y 轴的位置?
- java - 错误:用于编码 windows-1251 的不可映射字符 (0x98)