如何在Java中调用Kotlin类中的函数?

4

我在我的代码库中同时使用 Kotlin 和 Java。但我想知道是否有办法从 Java 中引用 Kotlin 函数?以下是我的 Kotlin 代码:

MyEvent.kt

open class MyEvent {
    @Inject
    lateinit var myService: MyService

    @Inject
    lateinit var app: MyApp

    var name: String = ""
    var options: MutableMap<String, String> = hashMapOf()
    var metrics: MutableMap<String, Double> = hashMapOf()

    init {
        app.component.inject(this)
    }

    fun identify() {
        myService.identify()
    }

}

现在,在我的基础应用程序类中调用“MyApplication”,我想调用识别功能。(我知道在Kotlin中我们可以通过MyEvent().identify来实现)但不知道在Java中怎么做?有什么线索吗?
提前感谢!

您需要其他的澄清吗? - LppEdd
不,都还好。只是想问另一个问题。你可以在Java中使用Companion吗?如果不能,类似这样的东西将会有什么等效替代方案:MyEventsLogin.Companion.newBuilder().setEventName(MyEventWrapper.AUTH_VIEW).build().trackScreenEvent(); - user2386226
请查看更新的答案。希望我理解你的意思是正确的。 - LppEdd
1个回答

3

Java中也是完全相同的。请记住它们共享同样的基础字节码

final MyEvent myEvent = new MyEvent();
myEvent.identify();

查看 Kotlin MyEvent 类的生成字节码(反编译)

public class my/package/MyEvent {
  ...

  public final identify()V
   L0
    LINENUMBER 14 L0
    RETURN // Omitted myService.identify()
  ...

一个伴生对象在Java中被翻译成一个静态类属性。
例如,对于这段Kotlin代码:
open class MyEvent {
    companion object {
        fun test() = ""
    }
    ...
}

这是生成的字节码

static <clinit>()V
    NEW my/package/MyEvent$Companion
    DUP
    ACONST_NULL
    INVOKESPECIAL my/package/MyEvent$Companion.<init> (Lkotlin/jvm/internal/DefaultConstructorMarker;)V
    PUTSTATIC my/package/MyEvent.Companion : Lmy/package/MyEvent$Companion;
    RETURN
    MAXSTACK = 3
    MAXLOCALS = 0
}

基本上意味着,
public class MyEvent {
   public static final Companion Companion = new Companion(...);
   ...
}

因此,在Java中,您将使用以下方式访问它:

MyEvent.Companion.test();

open class MyEvent {
    object Factory {
        fun test() = ""
    }
    ...
}

在Java中,可以这样做:

MyEvent.Factory.INSTANCE.test();

Java最终没有伴随对象的概念。
相反,使用static属性和方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接