JVM中如何表示本地范围的扩展功能?

时间:2019-04-15 05:37:44

标签: kotlin scope static-methods extension-function

我知道扩展功能被编译为静态方法,这些方法接收扩展类的实例作为第一个参数。但是,我所读过的任何文档都没有提到扩展功能在本地范围内的情况。

对于本地范围的扩展功能,它如何在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却没有。这里发生了什么?

0 个答案:

没有答案