【发布时间】:2016-07-27 10:59:32
【问题描述】:
以下代码无法编译:
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))
为什么编译器不能在这里推断字符串类型?有什么歧义吗?
一般来说,是否可以通过下划线扩展手动检查和检查生成的代码?
【问题讨论】:
-
@slouc,把它作为一个 asnwer 发布 - 这是一个正确的。如果 OP 创建了一些涉及与
String相关的一些变化或继承的类型类,那么它可能在某些情况下能够推断它,但否则你可以只传递一些ClassWithoutToInt并且它不能用下划线推断它,跨度> -
@sebszyller 我刚刚删除了我的评论,因为我认为它是错误的 :) 你如何解释如果它不是用于选项的事实,也就是说,如果方法只采用函数字符串=> T,你可以通过 f(_.toInt) 并且它会工作吗?
-
@slouc 我不知道你的答案是什么,但希望我能解释为什么它会起作用。
-
SO 抱怨没有提出足够多的问题。我同意按照共同的直觉,这应该可行。当然,我可能有充分的理由错了。
-
在 REPL 中使用
f(_.toInt) // show或-Xprint:typer来查看 typer 如何查看您的代码。
标签: scala