Scala: почему неявное преобразование типов нарушает код - PullRequest
1 голос
/ 13 октября 2019

У меня есть простой код

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 вообще отсутствует

1 Ответ

5 голосов
/ 13 октября 2019

Просто слишком много неявных преобразований. Попробуйте

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. И вывод типа / проверка типа работает так, что когда есть ошибка несоответствия типов, будет слишком поздно возвращаться и выбирать правильное неявное преобразование.

...