Scala 为什么对println和not print应用函数参数失败?

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

当我像这样将回调函数传递到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)) // 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 = {}
}