以下代码无法编译:
def f[T](conv: Option[String => T]) {}
f(Some(_.toInt))
Run Code Online (Sandbox Code Playgroud)
同 <console>:13: error: missing parameter type for expanded function ((x$1) => x$1.toInt)
当然,显式类型使它很好:
scala> f(Some((x: String) => x.toInt))
Run Code Online (Sandbox Code Playgroud)
为什么编译器不能在这里推断字符串类型?有某种歧义吗?
通常,是否可以通过下划线扩展手动检查和检查生成的代码?
基本问题(我相信)是在键入时Some(_.toInt)
,编译器需要推断类型参数Some.apply[A](x: A)
,并且要做到这一点,首先需要对参数进行类型检查.因此,_.toInt
将thpechecked A
(被认为是未知类型常量)作为预期类型.这失败了,因为当预期类型是函数类型时(或者从Scala 2.12开始,单个抽象方法类型),只允许匿名函数不指定参数类型.然后编译器再次尝试使用undefined
预期类型,并出于同样的原因失败.
在这种情况下,预期的返回类型实际上足以确定类型参数,然后这将允许类型检查_.toInt
,但这不是它的设计工作方式.
如果您需要,可以在http://scala-lang.org/files/archive/spec/2.11/06-expressions.html,第6.6,6.23和6.26.4段中找到详细信息.
归档时间: |
|
查看次数: |
2875 次 |
最近记录: |