java - 如何将 Java Stream 转换为 Scala 数组?

标签 java scala generics implicit-conversion scala-collections

给定

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)

这里出了什么问题?

最佳答案

编译器正在尝试查找 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)

关于java - 如何将 Java Stream 转换为 Scala 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53221663/

相关文章:

java - Checkmarx SQL 注入(inject)高严重性问题

java - 托管基于 Java 的 REST API 服务

scala - 这个功能可以用 Haskell 的类型系统实现吗?

scala - 如何在子项目中引用自定义 SBT 设置

scala - 验证列表 Scala 中的项目的好方法

java - 使用非 Comparable 类 : why a run-time exception, 而不是编译时错误创建 TreeSet?

java - 如何使用java在android中打开自定义方案

java - 如何在运行时设置通用Java类的类型?

java - 具有未知实现类的通用工厂

java - 将屏幕分成 4 个相等的部分 - android