最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2018年12月09日 17:01:01   作者:Dexlind  
這篇文章主要給大家介紹了關(guān)于Kotlin中Suppress的非常規(guī)用法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

常規(guī)用法

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

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

比較常見的,比如說(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è)后門打開。

@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ì)腳本之家的支持。

相關(guān)文章

  • Android 實(shí)例開發(fā)一個(gè)學(xué)生管理系統(tǒng)流程詳解

    Android 實(shí)例開發(fā)一個(gè)學(xué)生管理系統(tǒng)流程詳解

    讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)學(xué)生管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • Android中URLEncoder空格被轉(zhuǎn)碼為"+"號(hào)的處理辦法

    Android中URLEncoder空格被轉(zhuǎn)碼為"+"號(hào)的處理辦法

    當(dāng)上傳文件的文件名中間有空格,用URLEncoder.encode方法會(huì)把空格變成加號(hào)(+)在前臺(tái)頁(yè)面顯示的時(shí)候會(huì)多出加號(hào),下面這篇文章主要給大家介紹了關(guān)于Android中URLEncoder空格被轉(zhuǎn)碼為"+"號(hào)的處理辦法,需要的朋友可以參考下
    2023-01-01
  • Android 自定義圖片地圖坐標(biāo)功能的實(shí)現(xiàn)

    Android 自定義圖片地圖坐標(biāo)功能的實(shí)現(xiàn)

    最近項(xiàng)目要求實(shí)現(xiàn)一個(gè)在自定義地圖圖片上添加坐標(biāo)信息的功能,類似于在圖片做標(biāo)注的功能,這種功能糾結(jié)該如何實(shí)現(xiàn)呢?下面小編通過(guò)實(shí)例代碼給大家介紹Android 自定義地圖的實(shí)現(xiàn),需要的朋友參考下吧
    2021-07-07
  • Android獲取網(wǎng)絡(luò)圖片并顯示的方法

    Android獲取網(wǎng)絡(luò)圖片并顯示的方法

    這篇文章主要為大家詳細(xì)介紹了Android獲取網(wǎng)絡(luò)圖片并顯示的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Android利用ZXing掃描二維碼的實(shí)例代碼解析

    Android利用ZXing掃描二維碼的實(shí)例代碼解析

    這篇文章主要介紹了Android利用ZXing掃描二維碼的實(shí)例解析,代碼簡(jiǎn)單易懂,非常不錯(cuò),需要的朋友可以參考下
    2016-12-12
  • Android Studio中生成aar文件及本地方式使用aar文件的方法

    Android Studio中生成aar文件及本地方式使用aar文件的方法

    這篇文章給大家講解Android Studio中生成aar文件以及本地方式使用aar文件的方法,也就是說(shuō) *.jar 與 *.aar 的生成與*.aar導(dǎo)入項(xiàng)目方法,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2017-12-12
  • Android自定義View實(shí)現(xiàn)帶4圓角或者2圓角的效果

    Android自定義View實(shí)現(xiàn)帶4圓角或者2圓角的效果

    這篇文章主要介紹了Android自定義View實(shí)現(xiàn)帶4圓角或者2圓角的效果,本文通過(guò)實(shí)例代碼截圖給大家展示的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Android PopupWindow使用方法小結(jié)

    Android PopupWindow使用方法小結(jié)

    這篇文章主要為大家詳細(xì)介紹了Android PopupWindow使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Android實(shí)現(xiàn)簡(jiǎn)易版打地鼠

    Android實(shí)現(xiàn)簡(jiǎn)易版打地鼠

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡(jiǎn)易版打地鼠,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Android studio2.3.3升級(jí)到3.1.2坑(小記)

    Android studio2.3.3升級(jí)到3.1.2坑(小記)

    這篇文章主要介紹了Android studio2.3.3升級(jí)3.1.2坑(小記),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09

最新評(píng)論

齐齐哈尔市| 即墨市| 仁寿县| 册亨县| 个旧市| 许昌县| 徐州市| 沂水县| 甘德县| 仁寿县| 晋宁县| 阳原县| 定远县| 来凤县| 阿尔山市| 武穴市| 清新县| 达孜县| 连云港市| 牟定县| 四平市| 固原市| 凯里市| 普陀区| 雷波县| 宣武区| 青田县| 武胜县| 长沙县| 北京市| 义马市| 甘德县| 阿拉善右旗| 调兵山市| 海淀区| 巨野县| 利川市| 安多县| 前郭尔| 甘孜县| 左贡县|