Kotlin註解之JvmName

且聽真言發表於2020-10-17

我們首先定義給 Int定義一個擴充套件函式。

fun Int.compare(num: Int): Int {
    return if (this > num) {
        this
    } else num
}

在Kotlin程式碼中我們可以直接呼叫:

println(2.compare(1))

但是在 Java程式碼中我們的呼叫方式變為:

public static void main(String[] args) {
    int num = TestAnotionKt.compare(2, 1);
    System.out.println(num);
}

其實通過觀察Kotlin轉換為Java的程式碼就可以比較容易理解Java中的呼叫方式了,可以發現擴充套件被轉換成了一個靜態方法。類名變為:Koltin檔名+Kt

public final class TestAnotionKt {
   public static final int compare(int $this$compare, int num) {
      return $this$compare > num ? $this$compare : num;
   }
}

其實上述的方法類似於一個工具類:這個時候我們就可以使用JvmName註解來給Java的呼叫方式重新取一個名字。

@file:JvmName("IntUtils")

package com.example.annotation


fun Int.compare(num: Int): Int {
    return if (this > num) {
        this
    } else num
}

則在Java中可以進行如下呼叫:

int num = IntUtils.compare(1, 2);
System.out.println(num);

通過將Kotlin程式碼轉換成 Java程式碼,可以看出JvmName註解的作用:可以修改靜態方法所在的類名。

public final class IntUtils {
   public static final int compare(int $this$compare, int num) {
      return $this$compare > num ? $this$compare : num;
   }
}

 

 

相關文章