kotlin extension function实质上是java的静态函数,这个可以通过bytecode看到。
所谓的extension function是指对已有的,别人写的library的class进行扩展,也即在定义方法时,在方法头需要指定调用这个方法的对象类型。比如下边的例子,但是这也只是看起来像是扩展了别人的class,为其增加了一个新的方法,但实质上底层还是通过一个静态方法,将extension function的receiver,作为一个参数传给了该静态方法。
package indi.tom.base
fun main(){
var name = "tom"
var newName = name.applyThenReturn { str -> println("Your name is $str") }
println("My new name is $newName")
}
fun <T> T.applyThenReturn(f: (T) -> Unit): T{
f(this)
return this
}
编译成字节码,然后反编译成java代码如下:
public final class LambdaWithReceiverKt {
public static final void main() {
String name = "tom";
String newName = (String)applyThenReturn(name, (Function1)null.INSTANCE);
String var2 = "My new name is " + newName;
System.out.println(var2);
}
// $FF: synthetic method
public static void main(String[] var0) {
main();
}
public static final Object applyThenReturn(Object $this$applyThenReturn, @NotNull Function1 f) {
Intrinsics.checkNotNullParameter(f, "f");
f.invoke($this$applyThenReturn);
return $this$applyThenReturn;
}
}