接《Android開發者快速上手Kotlin(八) 之 協程官方框架Channel、Select和Flow》文章繼續。
16 Kotlin與Java混合開發
我們在前面介紹語法文章裏或多或少有提到過可以使用一些如@JvmXX的註解來解決默認參數、靜態成員等Kotlin和Java的兼容問題以及屬性、空指針安全、反射等語法的區別和使用。今天我們就來進行一個全面的總結關於Kotlin和Java共存混合開發的各種情況。
16.1 屬性讀寫
其實Java中並沒有屬性的概念,它並不是語法的規則,只是通過Getter和Setter約定來實現屬性的邏輯。而在Kotlin是存在真正意義上的屬性,所以在Kotlin裏會自動識別Java的Getter和Setter。 同樣道理,將Kotlin轉成Java後會自動生成Getter和Setter。
16.2 空類型安全
Kotlin中不區分裝箱類型和基本類型,而且Kotlin中任意類型都有可空和不可空兩種情況(默認不可空),若需要爲空的情況,需要在類型後面加一個問號”?”。所以如果在Kotlin裏想操作Java的代碼時就會遇到一個平臺類型,如果Java中返回的類型是String,那麼IDE就會提示其類型是String!(帶感嘆號的類型實質上是不存在的,僅爲IDE提示),當然我們在Android平臺上開發的話,返回String?,因爲它可爲空或者不爲空,這時需要開發者進行明確判斷。當然也可以在Java中通過註解@Nullable和@NotNull來明確返回類型是否爲空來彌補這一點。
16.3 包級函數
Kotlin包級函數就是直接在包下寫函數,不需要像Java那樣一定需要在類內。在編譯時Kotlin的包級函數會生成一個類,而此類包含了所有包級函數,在Java看來這些都是靜態方法。例如Kotlin中Utils.kt裏有一個getAbc的包級函數,那麼在Java中使用UtilsKt.getAbc()就可以調用。
16.4 伴生對象(@JvmStatic和@JvmField)
Kotlin使用靜態方法時,建議使用包級函數,就是直接在包下寫函數,不需要在類裏寫方法。但是如果一定需要像Java一樣在類裏的靜態方法,可以使用伴生對象。但是伴生對象在Java中的調用會多出一個Companion的單例,如果在Java中也希望可以像平時調用單例一樣調用,可以對伴生對象中的函數加上@JvmStatic註解以及對屬性加上@JvmField註解。
16.5 擴展方法和運算符重載
擴展方法對Java而言就是多出一個Receiver作爲參數的靜態方法。
運算符重載對Java而言就是多出一個Receiver作爲參數且對應名稱的靜態方法。
16.6 默認參數(@JvmOverloads)
Java中只有重載沒有默認參數,所以在Kotlin寫默認參數時希望Java也能享受此特性的話,應該加上@JvmOverloads註解標註該函數,這樣在Java中就會生成多個相應的重載方法。
16.7 指寫編譯類名(@file:JvmName)
正如前面介紹包級函數,我們如果需要調用Utils.kt文件裏的getAbc包級函數的話,在Java中會生成一個UtilsKt的類,因爲默認的命名就是xxKt。如果希望可以自定義其類名,只需要在文件最上面添加一個註解,@file:JvmName("xxxName") 就可以指定編譯後的名字。
16.8 data數據類和NoArg/AllOpen
在Kotlin中使用data關鍵字聲明類是數據類,它用於保存數據。但是由於data class要身的特性,它是final聲明的,而且沒有默認無參數的構造方法,像如果使用Gone需要序列化和反序列化是非常大的障礙,所以官方推出了NoArg插件爲被標註的類生成無參構造方法和AllOpen插件可以去掉final的聲明使類允許被繼承。
16.9 泛型
Kotlin和Java中的泛型區別不大,僅在於語法關鍵字上,比如:
- 通配符Kotlin的*對應Java的?
- 協變和逆變Kotlin的out/in對應Java的extends/super
16.10 SAM轉換
SAM全稱是Single Abstract Method,Kotlin中SAM轉換是有條件的:必須是Java代碼且僅有一個方法的接口。
16.11 反射
Kotlin依然可以使用Java的那套Type、Class、Field、Method反射對象;但其實Kotlin自身語法也支持了一套新的,它們對應KType、KClass、KProperty、KFunction。
16.12 正則表達式
Kotlin兼容Java的Pattern類使用正則表達式,同時也有自己專門處理正則表達式的類Regex。
16.3編碼切換查詢對應關係
我們在最開始第一篇文章也提到,如果在開發過程中,希望查看Kotlin的編碼或跟Java語法的對應關係,可以在【Tools】-【Kotlin】-【Show Kotlin Bytecode】中再點擊【Decompile】查看,如:
未完,請關注後面文章更新…