[Kotlin基礎] Java 呼叫 Kotlin(一)

万俟霜風發表於2018-04-29

Kotlin 和 Java 的互操作性是 Kotlin 的一大優點,Kotlin 呼叫 Java 已經基本不需要特別去注意什麼了,但是 Java 呼叫 Kotlin 程式碼就不那麼好看了。專案切換到 Kotlin 的過程中總會有兩種語言交錯的時候,最近切換 Kotlin 的第一版就要上線了,就先總結一下已經遇到的 Java 呼叫 Kotlin 的特殊姿勢。

不一樣的protected

  • Kotlin 繼承 Java 時,可以直接拿到 protected 屬性
  • Kotlin 繼承 Kotlin 時也一樣
  • 但是 Java 繼承 Kotlin 時,需要用 getter 和 setter 操作 protected 屬性
  • 舉個例子

[基類定義]

[Kotlin基礎] Java 呼叫 Kotlin(一)

[Java 中使用]

[Kotlin基礎] Java 呼叫 Kotlin(一)

  • 如果在 Kotlin 父類中是用 lazy 宣告的 protected 屬性,在 Java 中獲取還要加上getValue()(在 Kotlin 中對應 .value)

取代static的Companion

  • Kotlin 中沒有了 static 關鍵字,常量可以使用 伴生物件(companion object) 處理
  • 對於絕對的常量,可以使用 const 關鍵字,此時在 Java 中和在 Kotlin 中的呼叫方式是一樣的。const 只適用於直接初始化為一個 value 的情況。
  • 沒有 const 修飾的話,Java 中需要使用 getter 來獲取

[常量定義]

[Kotlin基礎] Java 呼叫 Kotlin(一)

[Kotlin 使用]

[Kotlin基礎] Java 呼叫 Kotlin(一)

[Java 使用]

[Kotlin基礎] Java 呼叫 Kotlin(一)

擴充套件函式和頂層函式

這兩個都是 Kotlin 的特性,在 Kotlin 中呼叫就是如絲般順滑,但是在 Java 中呼叫還是普通的靜態方法,類名是所在檔名加Kt:

[函式定義]

[Kotlin基礎] Java 呼叫 Kotlin(一)

[Kotlin 使用]

[Kotlin基礎] Java 呼叫 Kotlin(一)

[Java 使用]

[Kotlin基礎] Java 呼叫 Kotlin(一)

還原lambda

Kotlin 支援函式物件,可以將 lambda 作為函式的引數和返回值,這也是 Java 中沒有的特性,於是在 Java 中呼叫這類方法,就會變成匿名內部類(類名就叫 FunctionX, X是數字,表示引數數量):

[定義一個接收 lambda 的函式]

[Kotlin基礎] Java 呼叫 Kotlin(一)

[Kotlin 使用]

[Kotlin基礎] Java 呼叫 Kotlin(一)

[Java 使用]

[Kotlin基礎] Java 呼叫 Kotlin(一)

invoke 方法就是 lambda 的內容函式了,這也證明了 Kotlin 中 lambda 的實現方式還是定義了一個介面。使用 lambda 時需要考慮額外的效能開銷,儘量使用 inline 優化效能。

總結

Java 呼叫 Kotlin 並不是特別常用,畢竟我相信用過 Kotlin 之後,就不會想要使用 Java 了。這次情況特殊,在 Kotlin 的新專案中引入了一些過去的 Java Activity,真是沒有對比就沒有傷害啊。我再次重申,Kotlin,好用,炫酷,快來用(安利臉)

字數少了點,有機會再補全一下其他的互調的細節,所以加了個(一)。任何問題歡迎留言討論。RUA。

相關文章