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 為 falsea > b 為 true
a < b 為 false---------------------------
var a: Int? = null
var b: Int? = -1
a == b 為 falsea > 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 ))
希望對有需要的人有幫助
留言
張貼留言