Scala 为什么对println和not print应用函数参数失败?
当我像这样将回调函数传递到apply方法时,出现了编译错误Scala 为什么对println和not print应用函数参数失败?,scala,Scala,当我像这样将回调函数传递到apply方法时,出现了编译错误 Foo[Int](println) // Error: overloaded method ... cannot be applied to (Unit)Foo[Int](println) Foo[Int](f = println) // Error: overloaded method ... (f: Unit)Foo[Int](f = println) Foo[Int]((x:Int) => println(x)) // Wo
Foo[Int](println) // Error: overloaded method ... cannot be applied to (Unit)Foo[Int](println)
Foo[Int](f = println) // Error: overloaded method ... (f: Unit)Foo[Int](f = println)
Foo[Int]((x:Int) => println(x)) // Works!
起初我认为这是由于缺少参数列表,因为它适用于print
Foo[Int](print(_)) // works
Foo[Int](f = print(_)) // works
Foo[Int]((x:Int) => print(x)) // works
但是对于println
Foo[Int](println(_)) // Error:(6, 18) missing parameter type for expanded function ((x$1: <error>) => println(x$1)) Foo[Int](println(_))
Foo[Int](f = println(_)) // Error:(7, 22) missing parameter type for expanded function ((x$2: <error>) => println(x$2)) Foo[Int](f = println(_))
Foo[Int]((x:Int) => println(x)) // works
确实是
println()
和println(x:Any)
的重载导致了问题。编译器无法推断您引用的两个方法中的哪一个
您可以轻松地复制这一点:
def x():单位=???
def x(a:字符串):单位=???
定义y(a:字符串):单位=???
Foo[String](x())//未编译
Foo[String](y())//编译
Foo[String](x(_:String))//编译,强制编译器使用第二个实现
谢谢!我更喜欢Foo[String](x(\ux:String))
语法
package test
import org.reactivestreams.{Subscriber, Subscription};
object test extends App {
Foo[Int](println) // Error: cannot be applied to (Unit)Foo[Int](println)
Foo[Int](f = println) // Error: (f: Unit)Foo[Int](f = println)
Foo[Int]((x:Int) => println(x)) // Works!
}
object Foo {
def apply[T](f: T => Unit): Foo[T] = new Foo(
new Subscriber[T] {
override def onSubscribe(s: Subscription): Unit = {}
override def onNext(t: T): Unit = f(t)
override def onError(t: Throwable): Unit = {}
override def onComplete(): Unit = {}
}
)
}
case class Foo[T] (delegate: Subscriber[T]) extends Subscriber[T] {
override def onSubscribe(s: Subscription): Unit = {}
override def onNext(t: T): Unit = {}
override def onComplete(): Unit = {}
override def onError(t: Throwable): Unit = {}
}