這篇文章主要給大家介紹了關於Kotlin中Suppress的非常規用法的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨着小編來一起學習學習吧
前言
在 Java 中,有個叫 SuppressWarnings 的註解,用於忽略特定的編譯器警告。Kotlin 中也有一個類似功能的註解,叫做 Suppress,本文主要講講這個註解有什麼用。
常規用法
有時候會寫出這樣的一些代碼。這些在Kotlin編譯器的眼裏可能出現問題的代碼,實際上卻非常正確,跑起來不會出任何問題。
然後你就得到了一個編譯器警告(warning),甚至是編譯錯誤(error)。
比較常見的,比如說 unchecked cast:
val some: List<*> = emptyList<Nothing>() some as List<String> // Unchecked cast: List<*> to List<String>
然後就可以使用 Suppress 取消這個 warning:
val some: List<*> = emptyList<Nothing>() @Suppress("UNCHECKED_CAST") some as List<String>
再舉個例子:
sealed class Base { @Suppress("LeakingThis") val code = calculate() abstract fun calculate(): Int class Derived : Base() { override fun calculate() = 42 } }
上面這代碼並不會出現 warning 的具體說明裏的問題,所以使用了 Suppress 解決這個 warning。
這是很簡單的破事水,沒有任何討論的價值。
然後下面是正文。
好孩子不要模仿!很危險的!
非常規用法
這破註釋竟然能消除 error!
比如說這樣的代碼:
println((null as String?).length)
編譯器會告訴你這樣是不對的,然後向你丟出了一個 error:
Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
然後就可以使用 Suppress 讓編譯器閉嘴!
@Suppress("UNSAFE_CALL") println((null as String?).length)
然後就可以順利的通過編譯,編譯後跑一跑,就可以輕鬆地拿到一個空指針異常:
Exception in thread "main" java.lang.NullPointerException
at .......
很簡單,有了 Suppress,你就可以讓這些可以本來通過編譯器生成java字節碼,但是因爲各種各樣的原因(例如類型安全)被ban掉的代碼,順利通過編譯。
下面給幾個可能有用的例子。
例1
fun some(any: Any) { when(any) { is Array<String> -> println(any.size) } }
這是我吐槽過的「Java能做但是Kotlin做不了的事」系列之一。不考慮Kotlin的其他target(如js),在Jvm平臺上有如下的迂迴:
any is Array<*> && any.isArrayOf<String>()
就是很醜罷了。
在Kotlin的早期代碼,這樣的type check是允許的,因爲某些原因ban掉了(讀者可以想想爲什麼要ban掉這樣的代碼)。這個時候可以用 Suppress 把這個後門打開。
@Suppress("CANNOT_CHECK_FOR_ERASED")
例2
類型別名。
class Some { @Suppress("TOPLEVEL_TYPEALIASES_ONLY") typealias Str = String val a: Str = "" }
一目瞭然,不解釋。
例3
Kotlin 在遠古版本 M13 新增了 lateinit 修飾符,可以對只讀屬性和可變屬性使用。
然後 M14 版本就殘忍地 ban 掉了 lateinit val。
@Suppress("INAPPLICABLE_LATEINIT_MODIFIER") lateinit val lateInitVal: String
lateinit val 的用處可以看上面 M13 的鏈接裏面的說明。
例4
Kotlin Collection Literals 半成品。
@Suppress("UNSUPPORTED") val bs: BooleanArray = [true, false, true]
這是個未完成的功能,目前只支持數組。以後可以支持 List、Map 和 Set,所以爲了避免不必要的兼容性麻煩,在正常情況下只允許在註解裏這樣用。要想在其他地方用,就像上面代碼那樣。
結尾
想知道更多的Suppress選項的話,可以去翻Kotlin的源碼。
這種無法得到官方支持的奇技淫巧,也許下次更新就掛掉了,所以如果用了那就後果自負吧。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對神馬文庫的支持。