我知道扩展功能被编译为静态方法,这些方法接收扩展类的实例作为第一个参数。但是,我所读过的任何文档都没有提到扩展功能在本地范围内的情况。
对于本地范围的扩展功能,它如何在JVM中表示?如果它仍然是静态函数,是什么阻止了它在定义的范围之外使用?
例如,如果我定义以下代码:
fun Int.plusOne(): Int = plus(1)
fun three(): Int {
fun Int.plusTwo(): Int = plus(2)
return 0.plusOne() + 0.plusTwo()
}
fun main(): Unit {
println(0.plusOne())
// println(0.plusTwo()) // not available, because Int.plusTwo() is scoped to three()
println(three())
}
然后使用IntelliJ将其反编译为Java,我得到:
@Metadata(...)
public final class ExampleKt {
public static final int plusOne(int $receiver) {
return $receiver + 1;
}
public static final int three() {
<undefinedtype> plusTwo$ = null.INSTANCE;
return plusOne(0) + plusTwo$.invoke(0);
}
public static final void main() {
int var0 = plusOne(0);
System.out.println(var0);
var0 = three();
System.out.println(var0);
}
}
在我看来,<undefinedtype> plusTwo$ = null.INSTANCE;
似乎不是有效的Java,但显而易见的是,尽管plusOne
确实变成了静态函数,但plusTwo
却没有。这里发生了什么?