快速上手 Kotlin 開發系列之與 Java 互調 (2)

本節將介紹 Kotlin 和 Java 互調過程中封裝類、空值敏感以及靜態變量和靜態方法的處理

Kotlin 沒有封裝類

首先看看以下代碼。

我們用 Java 創建一個接口,如下:

快速上手 Kotlin 開發系列之與 Java 互調 (2)

之後我們創建一個 A.java 實現這個接口,並在每個方法中打印對應的類型,int 和 Integer。

快速上手 Kotlin 開發系列之與 Java 互調 (2)

最後,我們在 Kotlin 代碼中調用它,我們來看下它的執行結果:

快速上手 Kotlin 開發系列之與 Java 互調 (2)

快速上手 Kotlin 開發系列之與 Java 互調 (2)

你會發現只調用了 int 參數的方法,通過這個示例可以看出來 Kotlin 是沒有封裝類的概念的,為了進一步說明,我們讓 Kotlin 的類來實現這個接口:

快速上手 Kotlin 開發系列之與 Java 互調 (2)

你會發現編譯器會報方法名重複的錯誤,刪掉後正常

上述例子中如果非要調用 Integer 參數的方法,當然也是能做到的,可以通過反射的方法。

Kotlin 空值敏感

還是通過一個示例來說明,寫一個包含如下靜態方法的 Java 類:

快速上手 Kotlin 開發系列之與 Java 互調 (2)

之後在 Kotlin 代碼中調用這個方法,其中賦值方式有三種,分別是讓編譯器推斷、賦值給不為空的 String 類型以及賦值給可為空的 String? 類型。

快速上手 Kotlin 開發系列之與 Java 互調 (2)

首先看第一種編譯器推斷類型的方式,當我們使用編譯器查看類型時你會發現它返回的是 String! 的類型,這種類型我們不能直接聲明,這是 Kotlin 與 Java 互調時的一種特有的類型,也可以說成是 Java 的 String 類型。

快速上手 Kotlin 開發系列之與 Java 互調 (2)

之後我們執行 main 函數,看到代碼 10 行位置報錯,說明為空的值給不可為空的 String 類型賦值會報錯!

快速上手 Kotlin 開發系列之與 Java 互調 (2)

當我們註釋掉 fmt2 代碼繼續執行,你會發現編譯器會正常編譯通過,難道這就說明第 1、3 種方式是可靠的呢?我們嘗試調用 fmt1 的某個方法:

快速上手 Kotlin 開發系列之與 Java 互調 (2)

快速上手 Kotlin 開發系列之與 Java 互調 (2)

發現會報 NullPointerException 錯誤。為什麼會這樣呢? 因為 String! 類型 Kotlin 編譯器會認為這是兼容類型,你只能是臨時地使用,但是如果你調用它的話,就會像 Java 一樣去執行,所以就報了 Java 的空指針異常。

反觀 fmt3 就不會報錯,這就是 Kotlin 的空安全!

【注】當我們調用 Java 的方法返回類對象的時候,如果你不確定返回值是否可能為空,你一定要賦值給一個可空類型,這樣才能利用 Kotlin 的空安全!

Kotlin 沒有靜態變量與靜態方法

由於 Kotlin 中沒有靜態變量和靜態方法,我們可以通過上一節中提到的 object 關鍵字聲明的類來間接實現類似 Java 中的靜態方法。

快速上手 Kotlin 開發系列之與 Java 互調 (2)

快速上手 Kotlin 開發系列之與 Java 互調 (2)

如果讓其變成真正的靜態方法,可以通過使用 @JvmStatic 註解使其變成 Java 的靜態方法,這時就可以直接在 Java 類中調用。

快速上手 Kotlin 開發系列之與 Java 互調 (2)

快速上手 Kotlin 開發系列之與 Java 互調 (2)

以上就是本節內容,歡迎大家關注~


分享到:


相關文章: