def foo(num:Int, str:String):Int = 1
val bar = foo(3, _) // compiler complains "missing parameter type for expanded function ((x$1) => test(3, x$1))"
val baz = foo(3, _:String) // compiles fine
为什么在从上下文看起来可以推断时,我必须明确指定_的类型?
编辑:根据David Soergel的建议重命名以避免名称冲突。
答案 0 :(得分:3)
首先,为了避免“def test”和“val test”之间的混淆,让我们写一下:
def foo(num:Int, str:String):Int = 1
val bar = foo(3, _) // compiler complains "missing parameter type for expanded function ((x$1) => foo(3, x$1))"
val baz = foo(3, _:String) // compiles fine
从上下文中可以推断的只是bar的参数必须以某种方式转换为String。这可能是由于继承(如果你在那里使用一些非最终类型而不是String),或者是由于隐式转换。
基本上implicits的可能性意味着bar的参数可能只是任何类型,所以编写的代码确实是不明确的。在发出“缺失类型”错误之前,我不知道编译器是否实际检查范围内是否有任何适当的隐式转换,但我猜不会。 (在String的情况下,无论如何都可能存在一堆)。如果baz的签名由于导入可能产生String的新隐式而发生变化,那将是脆弱和混乱的。