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