对比Java学Kotlin从 Java 中引用 Kotlin 类名自动带上 Kt 后缀

Posted 陈蒙_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对比Java学Kotlin从 Java 中引用 Kotlin 类名自动带上 Kt 后缀相关的知识,希望对你有一定的参考价值。

文章目录

现象

假设我们有两个类文件,一个是Java:HostDemo.java,另一个是 Kotlin:UtilDemo.kt。这两个文件在同一个package内。

UtilDemo.kt 是一个工具类,我们要在 HostDemo.java 里面引用这个工具类。

其中 UtilDemo.kt 内容为:

package xxx.yyy

fun fun1() 
    // ommitted

HostDemo.java:

package xxx.yyy

public class HostDemo 
    public static void main(String args[]) 
        UtilDemoKt.fun1();
    

我们可以看到,在 Java 类文件中引用 UtilDemo.kt 的方式是:

UtilDemoKt.fun1();

而不是我们按照 Java 用法预期的:

UtilDemo.fun1();

为什么会这样?

原因

像 UtilDemo.kt 这种没有被 class 包裹、只有方法或属性的文件,我们称之为 包级别方法(package-level function),这种文件会被编译成相应的 Java 文件以完成和 HostDemo.java 进行相互调用,被编译成的 Java 文件(androidStudio—Tools—Show Kotlin Bytecode—Decompile)是:

package xxx.yyy

// ommitted

public final class UtilDemoKt 
   public static final void fun1() 
   


其实我们在 HostDemo.java 中引用的是 kotlin 的 bytecode,等效为上面这个编译后的 Java 文件,为了区分二者,在新生成的 Java 文件名加了个后缀 Kt。

如果不想使用后缀,可以使用 @file:JvmName("UtilDemo")来实现,
即,将 UtilDemo.kt 内容改为:

@file:JvmName("UtilDemo")

package xxx.yyy

fun fun() 
    // ommitted

这样我们就可以这样引用了:

UtilDemo.fun1();

参考

以上是关于对比Java学Kotlin从 Java 中引用 Kotlin 类名自动带上 Kt 后缀的主要内容,如果未能解决你的问题,请参考以下文章

对比Java学Kotlin密封类

对比Java学Kotlin内联类

对比Java学Kotlin内联类

对比Java学Kotlin内联类

对比Java学Kotlin常量

对比Java学Kotlin枚举