麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

Kotlin中Suppress的非常規(guī)用法示例

2024-07-21 23:03:51
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

在 Java 中,有個(gè)叫 SuppressWarnings 的注解,用于忽略特定的編譯器警告。Kotlin 中也有一個(gè)類似功能的注解,叫做 Suppress,本文主要講講這個(gè)注解有什么用。

常規(guī)用法

有時(shí)候會(huì)寫(xiě)出這樣的一些代碼。這些在Kotlin編譯器的眼里可能出現(xiàn)問(wèn)題的代碼,實(shí)際上卻非常正確,跑起來(lái)不會(huì)出任何問(wèn)題。

然后你就得到了一個(gè)編譯器警告(warning),甚至是編譯錯(cuò)誤(error)。

比較常見(jiàn)的,比如說(shuō) unchecked cast:

val some: List<*> = emptyList<Nothing>()some as List<String> // Unchecked cast: List<*> to List<String>

然后就可以使用 Suppress 取消這個(gè) warning:

val some: List<*> = emptyList<Nothing>()@Suppress("UNCHECKED_CAST")some as List<String>

再舉個(gè)例子:

sealed class Base { @Suppress("LeakingThis") val code = calculate() abstract fun calculate(): Int class Derived : Base() {  override fun calculate() = 42 }}

上面這代碼并不會(huì)出現(xiàn) warning 的具體說(shuō)明里的問(wèn)題,所以使用了 Suppress 解決這個(gè) warning。

這是很簡(jiǎn)單的破事水,沒(méi)有任何討論的價(jià)值。

然后下面是正文。

好孩子不要模仿!很危險(xiǎn)的!

非常規(guī)用法

這破注釋竟然能消除 error!

比如說(shuō)這樣的代碼:

println((null as String?).length)

編譯器會(huì)告訴你這樣是不對(duì)的,然后向你丟出了一個(gè) 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)

然后就可以順利的通過(guò)編譯,編譯后跑一跑,就可以輕松地拿到一個(gè)空指針異常:

Exception in thread "main" java.lang.NullPointerException
    at .......

很簡(jiǎn)單,有了 Suppress,你就可以讓這些可以本來(lái)通過(guò)編譯器生成java字節(jié)碼,但是因?yàn)楦鞣N各樣的原因(例如類型安全)被ban掉的代碼,順利通過(guò)編譯。

下面給幾個(gè)可能有用的例子。

例1

fun some(any: Any) { when(any) {  is Array<String> -> println(any.size) }}

這是我吐槽過(guò)的「Java能做但是Kotlin做不了的事」系列之一。不考慮Kotlin的其他target(如js),在Jvm平臺(tái)上有如下的迂回:

any is Array<*> && any.isArrayOf<String>()

就是很丑罷了。

在Kotlin的早期代碼,這樣的type check是允許的,因?yàn)槟承┰騜an掉了(讀者可以想想為什么要ban掉這樣的代碼)。這個(gè)時(shí)候可以用 Suppress 把這個(gè)后門(mén)打開(kāi)。

@Suppress("CANNOT_CHECK_FOR_ERASED")

例2

類型別名。

class Some { @Suppress("TOPLEVEL_TYPEALIASES_ONLY") typealias Str = String val a: Str = ""}

一目了然,不解釋。

例3

Kotlin 在遠(yuǎn)古版本 M13 新增了 lateinit 修飾符,可以對(duì)只讀屬性和可變屬性使用。

然后 M14 版本就殘忍地 ban 掉了 lateinit val。

@Suppress("INAPPLICABLE_LATEINIT_MODIFIER")lateinit val lateInitVal: String

lateinit val 的用處可以看上面 M13 的鏈接里面的說(shuō)明。

例4

Kotlin Collection Literals 半成品。

@Suppress("UNSUPPORTED")val bs: BooleanArray = [true, false, true]

這是個(gè)未完成的功能,目前只支持?jǐn)?shù)組。以后可以支持 List、Map 和 Set,所以為了避免不必要的兼容性麻煩,在正常情況下只允許在注解里這樣用。要想在其他地方用,就像上面代碼那樣。

結(jié)尾

想知道更多的Suppress選項(xiàng)的話,可以去翻Kotlin的源碼。

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

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到kotlin教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久亚洲精品久久国产一区二区 | 国产一级做a爱片在线看免 2019天天干夜夜操 | 欧美在线成人影院 | 国产精品视频专区 | 斗罗破苍穹在线观看免费完整观看 | 国产精品久久久久久久久久尿 | 欧美一区二区网站 | 欧美国产综合视频 | 国产妇女乱码一区二区三区 | 久久777国产线看观看精品 | 欧美性猛交xxx乱大交3蜜桃 | 亚洲视频在线观看免费视频 | av观看国产 | 法国性xxx精品hd专区 | www.com香蕉| 久久成人精品视频 | 欧美成人精品一区二区三区 | 精国品产一区二区三区有限公司 | 视频在线中文字幕 | 国产视频精品在线 | 日本在线高清 | 视频一区二区三区视频 | 久久亚洲精品11p | 中文字幕在线观看成人 | 成人在线视频网 | 免费观看一区 | 日韩一级免费毛片 | 欧美精品成人一区二区在线观看 | 7777欧美 | 久久久一区二区精品 | 黄视频网址| 制服丝袜成人动漫 | 神马视频我不卡 | 最新中文字幕日本 | 高清国产在线 | 性片网站 | 天天好比网 | 黄视频免费在线观看 | 国产91中文字幕 | 精品国产一区二区三区成人影院 | 在线看一级片 |