Как преобразовать поток Java в массив Scala? - PullRequest
0 голосов
/ 09 ноября 2018

С учетом

new Scanner(is)
    .tokens()
    .map(_.toInt)
    .toArray[Int]((_: Int) => Array.ofDim[Int](100000))

Я получаю ошибку компиляции

Error:(40, 12) no type parameters for method map: (x$1: java.util.function.Function[_ >: String, _ <: R])java.util.stream.Stream[R] exist so that it can be applied to arguments (java.util.function.Function[String,Int])
 --- because ---
argument expression's type is not compatible with formal parameter type;
 found   : java.util.function.Function[String,Int]
 required: java.util.function.Function[_ >: String, _ <: ?R]
Note: String <: Any, but Java-defined trait Function is invariant in type T.
You may wish to investigate a wildcard type such as `_ <: Any`. (SLS 3.2.10)
          .map(_.toInt)
Error:(40, 18) type mismatch;
 found   : java.util.function.Function[String,Int]
 required: java.util.function.Function[_ >: String, _ <: R]
          .map(_.toInt)

Что здесь не так?

1 Ответ

0 голосов
/ 09 ноября 2018

Компилятор пытается найти параметр типа R для Stream#map. Поскольку аргумент map является Function[String,Int], и он должен быть совместим с Function[_ >: String, _ <: R] (из подписи map), существует ограничение Int <: R. Но поскольку это метод Java, есть также ограничение R <: Object (по крайней мере, я так думаю). Так что нет подходящего R.

Сообщение об ошибке не очень хорошо в этом случае, потому что оно не дает второго ограничения.

Чтобы исправить, как я уже упоминал в комментарии, вы можете просто использовать mapToInt, но на самом деле есть еще худшее сообщение об ошибке, которое определенно следует исправить (я сообщал о проблеме): указание map[Int] приводит к

type mismatch;
 found   : Array[Int]
 required: Array[Int]
Note: Int >: Int, but class Array is invariant in type T.
You may wish to investigate a wildcard type such as `_ >: Int`. (SLS 3.2.10)
...