Стоит помнить, что Array
не является надлежащей коллекцией Scala, поэтому компилятору приходится работать усерднее, чтобы сначала преобразовать ее во что-то, что соответствует остальным Scala коллекциям
implicitly[Array[Char] <:< GenTraversableOnce[Char]] // error (Scala 2.12)
implicitly[Array[Char] <:< IterableOnce[Char]] // error (Scala 2.13)
Следовательно, поскольку flatMap
принимает функцию
String => GenTraversableOnce[Char]
, но мы передаем
String => Array[Char]
, компилятор сначала должен найти соответствующее неявное преобразование Array[Char]
в GenTraversableOnce[Char]
. А именно, это должно быть wrapCharArray
scala.collection.immutable.List.apply[String]("abc", "cde").flatMap[Char](((e: String) => scala.Predef.wrapCharArray(scala.Predef.augmentString(e).toArray[Char]((ClassTag.Char: scala.reflect.ClassTag[Char])))))
или короче
List("abc", "cde").flatMap(e => wrapCharArray(augmentString(e).toArray))
, однако из-за причин вывода типа, объясненных Jasper-M, компилятор не может выбрать wrapCharArray
преобразование. Как говорит Даниэль
Array
пытается быть коллекцией Java Array
и Scala одновременно. В большинстве случаев это удается, но в некоторых угловых случаях терпит неудачу.
Возможно, это один из тех угловых случаев. По этим причинам лучше избегать Array
, если это не обусловлено соображениями производительности или совместимости. Тем не менее, другой подход, который работает в Scala 2.13, заключается в использовании to(Collection)
метода
List("abc","cde").flatMap(_.to(Array))