Kotlin中Suppress的非常规用法示例
前言
在Java中,有个叫SuppressWarnings的注解,用于忽略特定的编译器警告。Kotlin中也有一个类似功能的注解,叫做Suppress,本文主要讲讲这个注解有什么用。
常规用法
有时候会写出这样的一些代码。这些在Kotlin编译器的眼里可能出现问题的代码,实际上却非常正确,跑起来不会出任何问题。
然后你就得到了一个编译器警告(warning),甚至是编译错误(error)。
比较常见的,比如说uncheckedcast:
valsome:List<*>=emptyList() someasList //Uncheckedcast:List<*>toList
然后就可以使用Suppress取消这个warning:
valsome:List<*>=emptyList() @Suppress("UNCHECKED_CAST") someasList
再举个例子:
sealedclassBase{ @Suppress("LeakingThis") valcode=calculate() abstractfuncalculate():Int classDerived:Base(){ overridefuncalculate()=42 } }
上面这代码并不会出现warning的具体说明里的问题,所以使用了Suppress解决这个warning。
这是很简单的破事水,没有任何讨论的价值。
然后下面是正文。
好孩子不要模仿!很危险的!
非常规用法
这破注释竟然能消除error!
比如说这样的代码:
println((nullasString?).length)
编译器会告诉你这样是不对的,然后向你丢出了一个error:
Onlysafe(?.)ornon-nullasserted(!!.)callsareallowedonanullablereceiveroftypeString?
然后就可以使用Suppress让编译器闭嘴!
@Suppress("UNSAFE_CALL") println((nullasString?).length)
然后就可以顺利的通过编译,编译后跑一跑,就可以轻松地拿到一个空指针异常:
Exceptioninthread"main"java.lang.NullPointerException
at.......
很简单,有了Suppress,你就可以让这些可以本来通过编译器生成java字节码,但是因为各种各样的原因(例如类型安全)被ban掉的代码,顺利通过编译。
下面给几个可能有用的例子。
例1
funsome(any:Any){ when(any){ isArray->println(any.size) } }
这是我吐槽过的「Java能做但是Kotlin做不了的事」系列之一。不考虑Kotlin的其他target(如js),在Jvm平台上有如下的迂回:
anyisArray<*>&&any.isArrayOf()
就是很丑罢了。
在Kotlin的早期代码,这样的typecheck是允许的,因为某些原因ban掉了(读者可以想想为什么要ban掉这样的代码)。这个时候可以用Suppress把这个后门打开。
@Suppress("CANNOT_CHECK_FOR_ERASED")
例2
类型别名。
classSome{ @Suppress("TOPLEVEL_TYPEALIASES_ONLY") typealiasStr=String vala:Str="" }
一目了然,不解释。
例3
Kotlin在远古版本M13新增了lateinit修饰符,可以对只读属性和可变属性使用。
然后M14版本就残忍地ban掉了lateinitval。
@Suppress("INAPPLICABLE_LATEINIT_MODIFIER") lateinitvallateInitVal:String
lateinitval的用处可以看上面M13的链接里面的说明。
例4
KotlinCollectionLiterals半成品。
@Suppress("UNSUPPORTED") valbs:BooleanArray=[true,false,true]
这是个未完成的功能,目前只支持数组。以后可以支持List、Map和Set,所以为了避免不必要的兼容性麻烦,在正常情况下只允许在注解里这样用。要想在其他地方用,就像上面代码那样。
结尾
想知道更多的Suppress选项的话,可以去翻Kotlin的源码。
这种无法得到官方支持的奇技淫巧,也许下次更新就挂掉了,所以如果用了那就后果自负吧。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。