Java调用Kotlin的包级函数
在 package com.easy.kotlin 包内的 KotlinExample.kt 源文件中声明的所有的函数和属性,包括扩展函数,都将编译成一个名为 com.easy.kotlin.KotlinExampleKt 的 Java 类中的静态方法。
代码示例:
Kotlin的包级属性、函数代码:
1. package com.easy.kotlin
3. fun f1() {
4. println("I am f1")
5. }
7. fun f2() {
8. println("I am f2")
9. }
11. val p: String = "PPP"
13. fun String.swap(index1: Int, index2: Int): String {
14. val strArray = this.toCharArray()
15. val tmp = strArray[index1]
16. strArray[index1] = strArray[index2]
17. strArray[index2] = tmp
19. var result = ""
20. strArray.forEach { result += it }
21. return result
22. }
24. fun main(args: Array<String>) {
25. println("abc".swap(0, 2))
26. }
编译成对应的Java的代码:
1. public final class KotlinExampleKt {
2. @NotNull
3. private static final String p = "PPP";
5. public static final void f1() {
6. String var0 = "I am f1";
7. System.out.println(var0);
8. }
10. public static final void f2() {
11. String var0 = "I am f2";
12. System.out.println(var0);
13. }
15. @NotNull
16. public static final String getP() {
17. return p;
18. }
20. @NotNull
21. public static final String swap(@NotNull String $receiver, int index1, int index2) {
22. Intrinsics.checkParameterIsNotNull($receiver, "$receiver");
23. char[] var10000 = $receiver.toCharArray();
24. Intrinsics.checkExpressionValueIsNotNull(var10000, "(this as java.lang.String).toCharArray()");
25. char[] strArray = var10000;
26. char tmp = strArray[index1];
27. strArray[index1] = strArray[index2];
28. strArray[index2] = tmp;
29. Object result = "";
30. char[] $receiver$iv = strArray;
32. for(int var7 = 0; var7 < $receiver$iv.length; ++var7) {
33. char element$iv = $receiver$iv[var7];
34. result = result + element$iv;
35. }
37. return result;
38. }
40. public static final void main(@NotNull String[] args) {
41. Intrinsics.checkParameterIsNotNull(args, "args");
42. String var1 = swap("abc", 0, 2);
43. System.out.println(var1);
44. }
45. }
我们可以看到,Kotlin中的扩展函数
1. fun String.swap(index1: Int, index2: Int): String
被编译成
1. public static final String swap(@NotNull String $receiver, int index1, int index2)
Kotlin中的String. 接收者被当做Java方法中的第一个参数传入。
Java调用Kotlin包级属性、函数的测试代码:
1. @Test
2. public void testPackageFun() {
3. KotlinExampleKt.f1();
4. KotlinExampleKt.f2();
5. System.out.println(KotlinExampleKt.getP());
6. KotlinExampleKt.swap("abc",0,1);
7. }
运行输出:
1. I am f1
2. I am f2
3. PPP
4. bac
另外,要注意的这里生成的类KotlinExampleKt,我们不能使用new来创建实例对象:
1. KotlinExampleKt example = new KotlinExampleKt();// 报错
报如下错误:
1. error: cannot find symbol
2. KotlinExampleKt example = new KotlinExampleKt();
3. ^
4. symbol: constructor KotlinExampleKt()
5. location: class KotlinExampleKt
6. 1 error
在编程中,我们推荐使用Kotlin默认的命名生成规则。如果确实有特殊场景需要自定义Kotlin包级函数对应的生成Java类的名字,我们可以使用 @JvmName 注解修改生成的 Java 类的类名:
1. @file:JvmName("MyKotlinExample")
3. package com.easy.kotlin
5. fun f3() {
6. println("I am f3")
7. }
9. fun f4() {
10. println("I am f4")
11. }
13. val p2: String = "PPP"
测试代码:
1. MyKotlinExample.f3();
2. MyKotlinExample.f4();
