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

德米特里·罗伊托夫(Dmitry Reutov)

我有一个简单的代码

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类型的行中冒出

米米(Dmytro Mitin)

太多的隐式转换。尝试

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而且类型推断/类型检查的工作原理是,当出现类型不匹配错误时,现在回来选择适当的隐式转换为时已晚。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在此代码中隐式类型转换结果不正确?

为什么Scala的编译器不能使用继承类型的隐式转换?

为什么对对象类型转换通用的是隐式的?

为什么不能隐式转换模板类型参数?

当对Option.getOrElse的返回值使用隐式转换时,为什么在Scala中类型推断失败?

Scala容器嵌套类型的隐式转换

Scala对类型别名的隐式转换

为什么隐式转换无法累计?

为什么 Rust 中的原始类型之间没有隐式类型转换(强制)

为什么不能强制转换的泛型类型无法隐式转换?

协变类型类的Scala隐式搜索将Nothing替换为type参数。为什么?

为什么我在 WindowsElement 上收到无法隐式转换 AppiumWebElement 的类型错误

为什么从Int到UInt的隐式类型转换不起作用?

为什么隐式类型转换在模板推导中不起作用?

为什么错误类型在我返回时没有隐式转换?

为什么非原始类型的隐式转换不是模棱两可的?

为什么不能从泛型约束隐式地推断出“ this”的类型转换?

为什么这种隐式转换(在不同的指针类型之间)有效?

接口,继承,隐式运算符和类型转换,为什么会这样?

为什么不能将类型'UnityEngine.Vector2'隐式转换为'float'?

Scala隐式参数的隐式转换

为什么这不隐式转换为转换构造函数?

为什么我允许显式实例化模板特化,而默认参数不能隐式转换为其他类型?

从Foo **到void **的无效转换-为什么允许隐式类型转换为void *但不允许为void **?

什么时候在C ++中进行隐式类型转换?

Lambda 的 Scala 隐式转换

Scala隐式转换的问题

为什么不能创建此隐式类型的数组?

为什么参数“ props”隐式具有“ any”类型?