对比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 后缀的主要内容,如果未能解决你的问题,请参考以下文章