📜  Kotlin 中的 JvmStatic、JvmOverloads 和 JvmField

📅  最后修改于: 2022-05-13 01:55:38.536000             🧑  作者: Mango

Kotlin 中的 JvmStatic、JvmOverloads 和 JvmField

在本文中,我们将看看如何在我们当前的Java代码中使用 Kotlin 中的 @JvmStatic、@JvmOverloads 和 @JvmField 来使用 Kotlin 代码。您可以从Java代码调用 Kotlin 代码,反之亦然。本博客将专注于从Java代码调用 Kotlin 代码。

Kotlin
// Kotlin Class
class GeeksforGeeks
// Calling from Kotlin
val article = Article()


Java
// Class in Java being called
Article geeksforgeeks = new Article();


Kotlin
object GeeksforGeeks {
    fun useSomeLogic() {
        // your code goes here
    }
}


Kotlin
GeeksforGeeks.useSomeLogic()


Java
GeeksforGeeks.INSTANCE.useSomeLogic();


Kotlin
object GeeksforGeeks {
    @JvmStatic
    fun useSomeLogic() {
        // logic goes here
    }
}


Java
GeeksforGeeks.useSomeLogic();


Kotlin
val articleOne = Event("GeeksforGeeks")
val articleTwo = Event("Android", Date())


Java
Article articleOne = new Event("GeeksforGeeks");
Article articleTwo = new Event("GeeksforGeeks", new Date());


Java
Article newArticle = new Event("GeeksforGeeks", new Date());
String articleName = newArticle.name;


正如您在前面的代码中看到的那样,从Java代码调用 Kotlin 代码相当简单,但有时并非如此。在这些情况下,我们在 Kotlin 中使用 @JvmStatic、@JvmOverloads 和 @JvmField 来简化从Java调用 Kotlin 代码的人。

@JvmStatic

包级函数在 Kotlin 中表示为静态方法。您还可以使用 Kotlin 中的 @JvmStatic 注释为伴随对象或命名对象中指定的函数创建静态方法。举个例子:

科特林



object GeeksforGeeks {
    fun useSomeLogic() {
        // your code goes here
    }
}

现在让我们调用 Kotlin:

科特林

GeeksforGeeks.useSomeLogic()

你需要打电话 像这样来自Java。

Java

GeeksforGeeks.INSTANCE.useSomeLogic();

科特林

object GeeksforGeeks {
    @JvmStatic
    fun useSomeLogic() {
        // logic goes here
    }
}

Java



GeeksforGeeks.useSomeLogic();

如果您没有在参数中提供日期,则在上述代码中将默认使用当前日期。所以,如果我们从 Kotlin 调用,下面的代码将无错误地执行:

科特林

val articleOne = Event("GeeksforGeeks")
val articleTwo = Event("Android", Date())

但是,如果我们从Java调用相同的函数,我们必须提供所有参数,否则我们会收到以下错误:

Java

Article articleOne = new Event("GeeksforGeeks");
Article articleTwo = new Event("GeeksforGeeks", new Date());

因此,我们可以使用@JvmOverloads 注释来利用默认值。使用注解后,Kotlin 代码将是:

data class GeeksforGeeks @JvmOverloads constructor( val articleName: String, val date: Date = Date())

@JvmField

让我们以文章上一节中的 Event 类为例。

data class GeeksforGeeks ( val articleName: String, val date: Date = Date())

因此,如果您希望将某个字段用作常规字段而不是 getter 或 setter,则必须指示编译器不要为其生成任何 getter 或 setter,这可以通过使用 @JvmField 注释来完成。因此,在应用 @JvmField 注释后,Kotlin 代码将是:

data class Article (@JvmField val geeksforgeeks: String, val date: Date = Date())

现在,在Java,您可以像在 Kotlin 中一样访问类的字段:

Java

Article newArticle = new Event("GeeksforGeeks", new Date());
String articleName = newArticle.name;
想要一个更快节奏和更具竞争力的环境来学习 Android 的基础知识吗?
单击此处前往由我们的专家精心策划的指南,旨在让您立即做好行业准备!