Java與Kotlin互調(diào)原理講解
一、Kt調(diào)用-Java參數(shù)非null的處理
@NotNull
class TestJava { ? ? public void toNotNull(@NotNull String title) {} ? ? public void toNull(String title){} }
Kotlin中調(diào)用
二、Kt調(diào)用- Java中使用kt關(guān)鍵字聲明的變量和方法
kotlin
中調(diào)用java方法,參數(shù)時,如果含有Kotlin關(guān)鍵字,必須增加 反引號 ``
public Object object; //使用kotlin中關(guān)鍵字命名的方法 public void is() { }
Kotlin中調(diào)用
?testJava.`is`() ?testJava.`object`
三、Kt調(diào)用Java-SAM轉(zhuǎn)換
在Kotlin中調(diào)用帶有接口參數(shù)的方法時,如果這個接口只有一個方法,那么就可以通過 lambda 表達(dá)式實(shí)現(xiàn) SAM轉(zhuǎn)換,從而簡化我們的代碼。
示例如下:
public class TestJavaSam { ?? ? ? void singleFun(@NotNull IListener iListener) {} ? ? void noParameter( @NotNull IListener iListener,int sum) {} ? ? void noParameterClean(int sum,@NotNull IListener iListener) {} } interface IListener { ? ? void onClick(); }
在Kotlin中調(diào)用
fun main() { ? ? val sam = TestJavaSam() ? ? sam.singleFun { ? ? } ? ? sam.noParameter({ ?? ??? ??? ?//如果更改一下java方法參數(shù)的順序,那么就會更簡潔,如下 ? ? },123) ? ? sam.noParameterClean(123){ ? ? } }
四、Kt中禁止Java調(diào)用某方法
@JvmSynthetic
在Kotlin
中,有些方法并不想暴露給Java調(diào)用,這時就可以增加這個注解在方法上。
@JvmSynthetic fun toMain() { }
此時toMain() 在Java中將無法調(diào)用到。
五、Java調(diào)用Kt-擴(kuò)展函數(shù)
@file:JvmName(“xx”)
在java中使用Kotlin
的擴(kuò)展函數(shù)時,我們都會使用相應(yīng)的類名+Kt 去調(diào)用相關(guān)的方法,有時候我們想自定義相應(yīng)的工具類,就顯得稍顯麻煩,如下:
比如我們有一個頂級擴(kuò)展函數(shù),位于 UiExpand.kt 中:
fun Int.px() {} **Java中調(diào)用 ** ? //Java調(diào)用kotlin類-(UiExpand)-Int.px() 擴(kuò)展方法 ? UiExpandKt.px(20);
如上所示,在Java中調(diào)用時,我們必須已文件名+kt后綴才可以調(diào)用。
通過給 UiExpand.kt 包名上增加 @file:JvmName(“Ui”),我們就可以實(shí)現(xiàn)自定義生成的類名去調(diào)用
如下:
Ui.px()
六、Java調(diào)用kt-成員變量
@JvmField
在Java中,我們?nèi)フ{(diào)用Kotlin 的 成員變量 時,編譯器都會幫我們自動生成相應(yīng)的 get,set方法,這很符合Java Bean的寫法,但是有些是有我們只是想直接去調(diào)用,這個時候就可以這樣去做。
Kotlin
data class TestKotlinBean( ? @JvmField val message: String,? ? @JvmField val title: String) **Java中調(diào)用 ** ?TestKotlinBean testKotlinBean = new TestKotlinBean("",""); ?String message = testKotlinBean.message; ?String title = testKotlinBean.title;
當(dāng)然對于 如下的示例,就算不用增加上面的注解,在java也都是可以直接調(diào)用,免除get
,set
。
lateinit var sum: String object UserPicCache{ ? ? ? ? const val KEY_CACHE = "CACHE" ?}
@get:JvmName,@set:JvmName
有些時候,我們只是想讓其生成其中的一個set或者get方法,這個時候就可以使用上述注解。
Kotlin
data class TestKotlinBean( ? ? @set:JvmName("setMessage") ? ? var message: String, ? ? @get:JvmName("getTitle") ? ? val title: String )
Java中調(diào)用:
?TestKotlinBean testKotlinBean = new TestKotlinBean("", ""); ?testKotlinBean.setMessage("message"); ?testKotlinBean.getTitle();
七、Java調(diào)用Kt-伴生對象
@JvmStatic
當(dāng)我們在Java中調(diào)用 Kotlin 伴生對象的方法或者變量時,必須通過 類名.Companion.xx 的方式才可以調(diào)用。這時候,我們就可以增加
@JvmStatic 來直接調(diào)用。
Kotlin
class Log { ? ? companion object { ? ? ? ? var time: String = "" ? ? ? ? fun toLog() { ? ? ? ? } ? ? } }
在Java中調(diào)用:
?ToLog.toLog(); ?ToLog.getTime();
不過需要注意的是,@JvmStatic
對性能沒有任何提升,因?yàn)橄鄳?yīng)的,編譯器又生成了一個靜態(tài)方法,對于可變變量,會生成兩個靜態(tài)方法set,get。
八、Java調(diào)用Kt-方法默認(rèn)參數(shù)值
@JvmOverloads
在Kotlin中,對于方法參數(shù),我們可能會加入一些默認(rèn)值,便于更好的使用,但是在Java中,如果調(diào)用時不傳遞相應(yīng)的方法參數(shù),就會提示報錯,這種使用就可以使用@JvmOverloads
修飾方法。
kotlin
object DialogUtils { ? ? @JvmStatic ? ? @JvmOverloads ? ? fun showPromptDialog(title: String = "提示") { ? ? } }
在java中調(diào)用
DialogUtils.showPromptDialog(); DialogUtils.showPromptDialog("標(biāo)題");
到此這篇關(guān)于Java與Kotlin互調(diào)原理的文章就介紹到這了,更多相關(guān)Java與Kotlin互調(diào)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java使用Optional實(shí)現(xiàn)優(yōu)雅避免空指針異常
空指針異常(NullPointerException)可以說是Java程序員最容易遇到的問題了。為了解決這個問題,Java?8?版本中推出了?Optional?類,本文就來講講如何使用Optional實(shí)現(xiàn)優(yōu)雅避免空指針異常吧2023-03-03Java Testcontainers庫實(shí)現(xiàn)測試功能
這篇文章主要介紹了Java Testcontainers庫實(shí)現(xiàn)測試功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09SpringBoot項(xiàng)目開發(fā)常用技術(shù)整合
今天給大家分享springboot項(xiàng)目開發(fā)常用技術(shù)整合,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-08-08Struts2實(shí)現(xiàn)對action請求對象的攔截操作方法
這篇文章主要介紹了Struts2實(shí)現(xiàn)對action請求對象的攔截操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-11-11Java實(shí)現(xiàn)讀取和寫入properties文件
這篇文章主要介紹了Java實(shí)現(xiàn)讀取和寫入properties文件方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08