以下代码无法编译:
def f[T](conv: Option[String => T]) {}
f(Some(_.toInt))
和 <console>:13: error: missing parameter type for expanded function ((x$1) => x$1.toInt)
当然,显式类型可以解决问题:
scala> f(Some((x: String) => x.toInt))
为什么编译器无法在此处推断String类型?是否有某种歧义?
通常,是否可以从下划线扩展中手动检查和检查生成的代码?
基本问题(我认为)是,在键入时Some(_.toInt)
,编译器需要推断的type参数Some.apply[A](x: A)
,然后首先要对参数进行类型检查。所以_.toInt
被typechecked与A
作为期望的类型(被视为一个未知类型常量)。这将失败,因为仅当期望的类型是函数类型(或从Scala 2.12(单一抽象方法类型)开始)时,才允许匿名函数不指定参数类型。然后,编译器undefined
以预期的类型再次尝试,但由于相同的原因而失败。
在这种情况下,预期的返回类型实际上足以确定type参数,然后允许进行typecheck _.toInt
,但这并不是它设计的工作方式。
如果需要,详细资料请参见http://scala-lang.org/files/archive/spec/2.11/06-expressions.html的6.6、6.23和6.26.4段。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句