中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Kotlin中Suppress的非常規用法示例

發布時間:2020-09-07 10:53:22 來源:腳本之家 閱讀:195 作者:Dexlind 欄目:移動開發

前言

在 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的源碼。

這種無法得到官方支持的奇技淫巧,也許下次更新就掛掉了,所以如果用了那就后果自負吧。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

金华市| 新津县| 志丹县| 烟台市| 叙永县| 五大连池市| 庄浪县| 海阳市| 江川县| 阿拉善盟| 九龙坡区| 游戏| 崇义县| 武定县| 西盟| 繁峙县| 宣城市| 济宁市| 汉阴县| 故城县| 克什克腾旗| 文安县| 巩留县| 独山县| 广宁县| 定远县| 镇坪县| 胶州市| 化隆| 英吉沙县| 九龙坡区| 和龙市| 米泉市| 鄱阳县| 崇文区| 炎陵县| 加查县| 芷江| 调兵山市| 永兴县| 马尔康县|