scala 匿名函数与函数重载

分享 未结
0 0 2 262
xy125730 2020-06-01发布
收藏 点赞

最近在学Scala的时候,发现了一个让人很迷惑的事情

我的环境是:

  1. IDEA
  2. scala-sdk-2.13.2
object Test{
   def foo():Unit={
     println("foo()")
   }
   def foo(str:String):Unit={
     println("foo(String)")
   }
   def main(args:String):Unit={
     val t1 = foo _   //能够被正确编译
     val t2 = foo(_)  //编译报错,missing parameter type for expanded function
   }
}

我的理解是这样的:

  1. foo _为eta-expantion,根据语言spec,会自动引用foo(),并将其展开为函数
  2. foo(_) 为匿名函数的简写形式,会展开成(x$1)=>foo(x$1),需要推断x$1的类型,但根据spec中的6.26.3 overloading resolution的定义,候选方法应该只有foo(str:String)呀,所以可以推断x$1为String类型,而能正确编译,但为什么会报错?

恳请大佬指点,谢谢!

回帖