【发布时间】:2019-01-18 23:06:12
【问题描述】:
我有这段代码:
import java.util.stream._
import java.util.function._
final case class AbcTest(value: String)
def funToFunction[InT, OutT](fun: InT => OutT): Function[InT, OutT] = new Function[InT, OutT] {
override def apply(t: InT): OutT = fun(t)
}
def main(args: Array[String]): Unit = {
Stream.of("a", "b", "c")
.map[AbcTest](funToFunction((v: String) => AbcTest(v)))
.collect(Collectors.toList())
}
它失败并显示以下错误消息:
Error:(43, 27) type mismatch;
found : java.util.stream.Collector[Nothing,?0(in method main),java.util.List[Nothing]] where type ?0(in method main)
required: java.util.stream.Collector[_ >: test.AbcTest, ?, ?]
Note: Nothing <: Any, but Java-defined trait Collector is invariant in type T.
You may wish to investigate a wildcard type such as `_ <: Any`. (SLS 3.2.10)
.collect(Collectors.toList)
我不明白发生了什么,请帮忙。
【问题讨论】:
-
我还不清楚“为什么”,但
Stream.of("a", "b", "c").map[AbcTest](funToFunction((v: String)=>AbcTest(v))似乎有效。类型推断似乎是个问题。 -
@GPI 正在测试这个,在我的编译器中,它说这缺少一个')',当我添加它时,我遇到了同样的问题......你的行为不同吗?跨度>
-
@jwismar 请重试,因为我从
java.util.function.Function中删除了java.util.function。我更新了答案。 -
@GPI 是的,这很重要。现在似乎可以工作了。
-
scala-java8-compat 库对于在 Scala 的函数类型和 Java 的函数类型之间进行转换很有用