Java 调用 Kotlin
Kotlin 和 Java 的互操作性是 Kotlin 的一大優(yōu)點(diǎn),Kotlin 調(diào)用 Java 已經(jīng)基本不需要特別去注意什么了,但是 Java 調(diào)用 Kotlin 代碼就不那么好看了。項(xiàng)目切換到 Kotlin 的過(guò)程中總會(huì)有兩種語(yǔ)言交錯(cuò)的時(shí)候,最近切換 Kotlin 的第一版就要上線了,就先總結(jié)一下已經(jīng)遇到的 Java 調(diào)用 Kotlin 的特殊姿勢(shì)。
不一樣的protected
- Kotlin 繼承 Java 時(shí),可以直接拿到 protected 屬性
- Kotlin 繼承 Kotlin 時(shí)也一樣
- 但是 Java 繼承 Kotlin 時(shí),需要用 getter 和 setter 操作 protected 屬性
- 舉個(gè)例子
[基類(lèi)定義]
?
?
[Java 中使用]
?
?
- 如果在 Kotlin 父類(lèi)中是用 lazy 聲明的 protected 屬性,在 Java 中獲取還要加上getValue()(在 Kotlin 中對(duì)應(yīng) .value)
ps:使用@JvmField注解可以獲得和Kotlin一樣的體驗(yàn)
取代static的Companion
- Kotlin 中沒(méi)有了 static 關(guān)鍵字,常量可以使用 伴生對(duì)象(companion object) 處理
- 對(duì)于絕對(duì)的常量,可以使用 const 關(guān)鍵字,此時(shí)在 Java 中和在 Kotlin 中的調(diào)用方式是一樣的。const 只適用于直接初始化為一個(gè) value 的情況。
- 沒(méi)有 const 修飾的話,Java 中需要使用 getter 來(lái)獲取
[常量定義]
?
?
[Kotlin 使用]
?
?
[Java 使用]
?
ps:可以使用@JvmStatic獲得一樣的體驗(yàn)
擴(kuò)展函數(shù)和頂層函數(shù)(Any的擴(kuò)展函數(shù))
這兩個(gè)都是 Kotlin 的特性,在 Kotlin 中調(diào)用就是如絲般順滑,但是在 Java 中調(diào)用還是普通的靜態(tài)方法,類(lèi)名是所在文件名加Kt:
[函數(shù)定義]
?
?
[Kotlin 使用]
?
?
[Java 使用]
?
?
還原lambda
Kotlin 支持函數(shù)對(duì)象,可以將 lambda 作為函數(shù)的參數(shù)和返回值,這也是 Java 中沒(méi)有的特性,于是在 Java 中調(diào)用這類(lèi)方法,就會(huì)變成匿名內(nèi)部類(lèi)(類(lèi)名就叫 FunctionX, X是數(shù)字,表示參數(shù)數(shù)量):
[定義一個(gè)接收 lambda 的函數(shù)]
?
?
[Kotlin 使用]
?
[Java 使用]
?
?
invoke 方法就是 lambda 的內(nèi)容函數(shù)了,這也證明了 Kotlin 中 lambda 的實(shí)現(xiàn)方式還是定義了一個(gè)接口(我記得方法也是一個(gè)對(duì)象,應(yīng)該不是一個(gè)接口)。使用 lambda 時(shí)需要考慮額外的性能開(kāi)銷(xiāo),盡量使用 inline 優(yōu)化性能。
ps:我測(cè)試了一下,函數(shù)的最后一個(gè)泛型是返回值的類(lèi)型
總結(jié)
Java 調(diào)用 Kotlin 并不是特別常用,畢竟我相信用過(guò) Kotlin 之后,就不會(huì)想要使用 Java 了。這次情況特殊,在 Kotlin 的新項(xiàng)目中引入了一些過(guò)去的 Java Activity,真是沒(méi)有對(duì)比就沒(méi)有傷害啊。
原文鏈接:https://juejin.im/post/5adda4b35188256712782274
總結(jié)
以上是生活随笔為你收集整理的Java 调用 Kotlin的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安卓队列缓存文件,包括断点续传
- 下一篇: 学习Kotlin(一)为什么使用Kotl