Java與Kotlin互調原理
一、Kt調用-Java參數非null的處理
@NotNull
class TestJava { public void toNotNull(@NotNull String title) {} public void toNull(String title){} }
Kotlin中調用
二、Kt調用- Java中使用kt關鍵字聲明的變量和方法
kotlin
中調用java方法,參數時,如果含有Kotlin關鍵字,必須增加 反引號 “
public Object object; //使用kotlin中關鍵字命名的方法 public void is() { }
Kotlin中調用
testJava.`is`() testJava.`object`
三、Kt調用Java-SAM轉換
在Kotlin中調用帶有接口參數的方法時,如果這個接口隻有一個方法,那麼就可以通過 lambda 表達式實現 SAM轉換,從而簡化我們的代碼。
示例如下:
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中調用
fun main() { val sam = TestJavaSam() sam.singleFun { } sam.noParameter({ //如果更改一下java方法參數的順序,那麼就會更簡潔,如下 },123) sam.noParameterClean(123){ } }
四、Kt中禁止Java調用某方法
@JvmSynthetic
在Kotlin
中,有些方法並不想暴露給Java調用,這時就可以增加這個註解在方法上。
@JvmSynthetic fun toMain() { }
此時toMain() 在Java中將無法調用到。
五、Java調用Kt-擴展函數
@file:JvmName(“xx”)
在java中使用Kotlin
的擴展函數時,我們都會使用相應的類名+Kt 去調用相關的方法,有時候我們想自定義相應的工具類,就顯得稍顯麻煩,如下:
比如我們有一個頂級擴展函數,位於 UiExpand.kt 中:
fun Int.px() {} **Java中調用 ** //Java調用kotlin類-(UiExpand)-Int.px() 擴展方法 UiExpandKt.px(20);
如上所示,在Java中調用時,我們必須已文件名+kt後綴才可以調用。
通過給 UiExpand.kt 包名上增加 @file:JvmName(“Ui”),我們就可以實現自定義生成的類名去調用
如下:
Ui.px()
六、Java調用kt-成員變量
@JvmField
在Java中,我們去調用Kotlin 的 成員變量 時,編譯器都會幫我們自動生成相應的 get,set方法,這很符合Java Bean的寫法,但是有些是有我們隻是想直接去調用,這個時候就可以這樣去做。
Kotlin
data class TestKotlinBean( @JvmField val message: String, @JvmField val title: String) **Java中調用 ** TestKotlinBean testKotlinBean = new TestKotlinBean("",""); String message = testKotlinBean.message; String title = testKotlinBean.title;
當然對於 如下的示例,就算不用增加上面的註解,在java也都是可以直接調用,免除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中調用:
TestKotlinBean testKotlinBean = new TestKotlinBean("", ""); testKotlinBean.setMessage("message"); testKotlinBean.getTitle();
七、Java調用Kt-伴生對象
@JvmStatic
當我們在Java中調用 Kotlin 伴生對象的方法或者變量時,必須通過 類名.Companion.xx 的方式才可以調用。這時候,我們就可以增加
@JvmStatic 來直接調用。
Kotlin
class Log { companion object { var time: String = "" fun toLog() { } } }
在Java中調用:
ToLog.toLog(); ToLog.getTime();
不過需要註意的是,@JvmStatic
對性能沒有任何提升,因為相應的,編譯器又生成瞭一個靜態方法,對於可變變量,會生成兩個靜態方法set,get。
八、Java調用Kt-方法默認參數值
@JvmOverloads
在Kotlin中,對於方法參數,我們可能會加入一些默認值,便於更好的使用,但是在Java中,如果調用時不傳遞相應的方法參數,就會提示報錯,這種使用就可以使用@JvmOverloads
修飾方法。
kotlin
object DialogUtils { @JvmStatic @JvmOverloads fun showPromptDialog(title: String = "提示") { } }
在java中調用
DialogUtils.showPromptDialog(); DialogUtils.showPromptDialog("標題");
到此這篇關於Java與Kotlin互調原理的文章就介紹到這瞭,更多相關Java與Kotlin互調內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Kotlin與Java相互調用的完整實例
- Android 運用@JvmName解決函數簽名沖突問題詳解
- Kotlin與Java的區別詳解
- Kotlin函數使用示例教程
- 秒懂Kotlin之Java工程師快速掌握Kotlin的技巧