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();
How can we make it function if we don’t use the INSTANCE?
JvmStatic is the answer.
科特林
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());
We’ve passed both arguments. So, what’s the point of using the default value if we have to pass both values?
因此,我们可以使用@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;