Kotlin Nullable Type Operator Overloading Notes

那天在臉書社團

看到有人提到是否能用 operator overloading 來達成 Int? > Int?


先來研究 operator overloading

https://kotlinlang.org/docs/operator-overloading.html

其開宗明義的第一句

Kotlin allows you to provide custom implementations for the predefined set of operators on types

其意思是說,Kotlin 允許客製化實作 type 的運算子之重載。

 

接著了解什麼是 Kotlin 的 type

https://kotlinlang.org/docs/basic-types.html

Int 為 integer type

那 Int? 是什麼呢? 

 

Null Safety

https://kotlinlang.org/docs/null-safety.html

Int? 即為 nullable integer type。

所以 Int? > Int? 是可以實踐的。

 

在 operator overloading 中有提到

a > b 在編譯時

會轉換成 a.compareTo( b ) > 0

所以 Int? > Int? 最主要是要實作 Int?.compareTo( Int? )

 

看到這裡應該會有點納悶

以以下的例子來看

var a: Int? = null

a?.let {} 

這樣的 let 是不會執行的

因為 null safety 中的 safe calls

https://kotlinlang.org/docs/null-safety.html#safe-calls

但我們要實作的 Int?.compareTo( Int? ) 

是否會因為 safe calls 而導致 compareTo 不會被執行

我們來看實際的語法會比較容易了解

a.compareTo( Int? ) => 在編譯時會轉換成實作的 Int?.compareTo( Int? )

a?.compareTo( Int? ) => 會因為 safe calls 不會被執行

 

再來看 Int? 與 Int? 要怎麼比較?

var a: Int? = null

var b: Int? = null

a == b 為 true

a > b 為 false

a < b 為 false

---------------------------

var a: Int? = -1

var b: Int? = null

a == b 為 false

a > b 為 true

a < b 為 false

---------------------------

var a: Int? = null

var b: Int? = -1

a == b 為 false

a > b 為 false

a < b 為 true

 

最後實作出以下函式

operator fun Int?.compareTo( other: Int?) = if ( this == other ) 0 else ( if ( this == null ) -1 else ( if ( other == null ) 1 else this - other ))

希望對有需要的人有幫助






留言

這個網誌中的熱門文章

泰文子音與字形之間的變化

AUTOMAXX UP-5HX 使用心得