Android開發者快速上手Kotlin(九) 之 Kotlin與Java混合開發

《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。

更多Kotlin屬性介紹

16.2 空類型安全

Kotlin中不區分裝箱類型和基本類型,而且Kotlin中任意類型都有可空和不可空兩種情況(默認不可空),若需要爲空的情況,需要在類型後面加一個問號”?”。所以如果在Kotlin裏想操作Java的代碼時就會遇到一個平臺類型,如果Java中返回的類型是String,那麼IDE就會提示其類型是String!(帶感嘆號的類型實質上是不存在的,僅爲IDE提示),當然我們在Android平臺上開發的話,返回String?,因爲它可爲空或者不爲空,這時需要開發者進行明確判斷。當然也可以在Java中通過註解@Nullable和@NotNull來明確返回類型是否爲空來彌補這一點。

更多Kotlin空類型安全介紹

16.3 包級函數

Kotlin包級函數就是直接在包下寫函數,不需要像Java那樣一定需要在類內。在編譯時Kotlin的包級函數會生成一個類,而此類包含了所有包級函數,在Java看來這些都是靜態方法。例如Kotlin中Utils.kt裏有一個getAbc的包級函數,那麼在Java中使用UtilsKt.getAbc()就可以調用。

16.4 伴生對象(@JvmStatic和@JvmField)

Kotlin使用靜態方法時,建議使用包級函數,就是直接在包下寫函數,不需要在類裏寫方法。但是如果一定需要像Java一樣在類裏的靜態方法,可以使用伴生對象。但是伴生對象在Java中的調用會多出一個Companion的單例,如果在Java中也希望可以像平時調用單例一樣調用,可以對伴生對象中的函數加上@JvmStatic註解以及對屬性加上@JvmField註解。

更多Kotlin伴生對象介紹

16.5 擴展方法和運算符重載

擴展方法對Java而言就是多出一個Receiver作爲參數的靜態方法。

運算符重載對Java而言就是多出一個Receiver作爲參數且對應名稱的靜態方法。

更多Kotlin擴展方法和運算符重載介紹

16.6 默認參數(@JvmOverloads)

Java中只有重載沒有默認參數,所以在Kotlin寫默認參數時希望Java也能享受此特性的話,應該加上@JvmOverloads註解標註該函數,這樣在Java中就會生成多個相應的重載方法。

更多Kotlin默認參數介紹

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的聲明使類允許被繼承。

更多Kotlin類據類介紹

16.9 泛型

Kotlin和Java中的泛型區別不大,僅在於語法關鍵字上,比如:

  1. 通配符Kotlin的*對應Java的?
  2. 協變和逆變Kotlin的out/in對應Java的extends/super

更多Kotlin泛型介紹

16.10 SAM轉換

SAM全稱是Single Abstract Method,Kotlin中SAM轉換是有條件的:必須是Java代碼且僅有一個方法的接口。

更多Kotlin SAM轉換介紹

16.11 反射

Kotlin依然可以使用Java的那套Type、Class、Field、Method反射對象;但其實Kotlin自身語法也支持了一套新的,它們對應KType、KClass、KProperty、KFunction。

更多Kotlin 反射介紹

16.12 正則表達式

Kotlin兼容Java的Pattern類使用正則表達式,同時也有自己專門處理正則表達式的類Regex。

更多Kotlin 正則表達式介紹

16.3編碼切換查詢對應關係

我們在最開始第一篇文章也提到,如果在開發過程中,希望查看Kotlin的編碼或跟Java語法的對應關係,可以在【Tools】-【Kotlin】-【Show Kotlin Bytecode】中再點擊【Decompile】查看,如:

https://img-blog.csdnimg.cn/20200417112733420.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x5el96eXg=,size_16,color_FFFFFF,t_70

 

 

未完,請關注後面文章更新…

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章