为什么可以';t I隐式转换Scala';s Function1到java.util.function.function?

为什么可以';t I隐式转换Scala';s Function1到java.util.function.function?,java,scala,java-8,implicit,Java,Scala,Java 8,Implicit,我试图创建Scala的Function1到java.util.function.function的隐式转换 这是我的密码: object Java8ToScala extends App { implicit def javaFuncToScalaFunc[T, R](func1: Function[T, R]): function.Function[T,R] = { new function.Function[T, R] { override def apply(t:

我试图创建Scala的Function1到java.util.function.function的隐式转换

这是我的密码:

object Java8ToScala extends App {

  implicit def javaFuncToScalaFunc[T, R](func1: Function[T, R]): function.Function[T,R] = {
    new function.Function[T, R] {
      override def apply(t: T): R = func1.apply(t)
    }
  }

  val javaFunc:function.Function[String,Int] = (s:String) => s.length

  println(javaFunc.apply("foo")) // this works

  private val strings = new util.ArrayList[String]()
  println(strings.stream().map(javaFunc).collect(Collectors.toList())) // this doesn't work

}
编译器消息很难理解:

[error] /xxx/Java8ToScala.scala:74: 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])
[error]  --- because ---
[error] argument expression's type is not compatible with formal parameter type;
[error]  found   : java.util.function.Function[String,Int]
[error]  required: java.util.function.Function[_ >: String, _ <: ?R]
[error] Note: String <: Any, but Java-defined trait Function is invariant in type T.
[error] You may wish to investigate a wildcard type such as `_ <: Any`. (SLS 3.2.10)
[error]     .map(javaFunc).collect(Collectors.toList()))
[error]      ^
[error] /xxx/Java8ToScala.scala:74: type mismatch;
[error]  found   : java.util.function.Function[String,Int]
[error]  required: java.util.function.Function[_ >: String, _ <: R]
[error]     .map(javaFunc).collect(Collectors.toList()))
[error]          ^
[error] two errors found
[error] (compile:compileIncremental) Compilation failed
[error] Total time: 7 s, completed Dec 18, 2015 10:51:15 AM

[error]/xxx/Java8ToScala.scala:74:方法映射没有类型参数:(x$1:java.util.function.function[\u>:String,\up>使用以下隐式转换:

implicit def javaFuncToScalaFunc[T, R](func1: function.Function[T, R]): Function[T,R] = {
  new Function[T, R] {
    override def apply(t: T): R = func1.apply(t)
  }
}

在您的代码中,您有一个从Scala函数到Java函数的隐式转换,但是您应该有一个从Java函数到Scala函数的隐式转换。

这只是Scala类型推断失败了,尽管我不明白为什么:它似乎在寻找一个扩展了
AnyRef
R
。如果您使用这样的键入,例如
val javaFunc:function.function[String,String]=(s:String)=>s


然而,它并没有得到任何上限:使用
map[Int]
也显式地。

这也不起作用,@Java Anto。创建这种反向转换没有多大意义,因为我实际上想做的是传递一个Scala函数,其中需要一个
Java.util.function.function
。我想你必须在这里帮助编译器。尝试
strings.stream().map[Int](javaFunc).
我想你会想用这个。