这似乎很奇怪。以下将编译正常:
def foo(s: String) = "balsh"
def foo(s: String)(s2: String) = "kahsd"
如果我将第二个参数设为隐式,它仍然可以正常编译。
但是,以下内容不会:
def foo(s: String) = "bjda"
def foo(s: String)(fun: String => String) = fun(s)
^由于“对重载定义的模糊引用”,该文件将无法编译。
我最初的想法是 Scala 将函数转换为 Java 的方式导致两者的签名相同。但是,查看使用 javap 编码的编译(仅用于第二个函数,因为它不会同时编译),您会看到这样的函数实际上被转换为:
public java.lang.String foo(java.lang.String, scala.Function1);
因此创建了一个单独的方法,具有不同的签名。那么为什么编译失败呢?
现在让事情变得更加混乱,以下实际上编译得很好!
def foo(s: String) = "bjda"
def foo(s: String, fun: String => String) = fun(s)
如果你把函数作为第一组参数的一部分,那么一切都很好!
有谁知道为什么会这样?
编辑:
所以我只是尝试了这个:
object main {
def write(s: String) = "sasd"
def write(s: String)(implicit s2: String => String) = s2(s)
}
我只是将第二个参数中的函数设为隐式。瞧,这编译了。
这是它产生的java代码:
public final class main$ extends java.lang.Object{
public static final main$ MODULE$;
public static {};
public java.lang.String write(java.lang.String);
public java.lang.String write(java.lang.String, scala.Function1);
}
这就是我对没有隐含的原始版本所期望的!