Я понимаю, что функции расширения компилируются в статические методы, которые получают экземпляр расширенного класса в качестве первого аргумента. Однако ни в одной из прочитанных мной документов не говорится о случае, когда функция расширения имеет локальную область действия.
Для функции расширения с локальной областью действия, как она представлена в 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
не стал. Что здесь происходит?