Kotlin中Suppress的非常规用法示例

 更新时间:2018年12月09日 17:01:01   作者:Dexlind  
这篇文章主要给大家介绍了关于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的源码。

这种无法得到官方支持的奇技淫巧,也许下次更新就挂掉了,所以如果用了那就后果自负吧。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Android 实例开发一个学生管理系统流程详解

    Android 实例开发一个学生管理系统流程详解

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用Java实现一个学生管理系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • Android中URLEncoder空格被转码为"+"号的处理办法

    Android中URLEncoder空格被转码为"+"号的处理办法

    当上传文件的文件名中间有空格,用URLEncoder.encode方法会把空格变成加号(+)在前台页面显示的时候会多出加号,下面这篇文章主要给大家介绍了关于Android中URLEncoder空格被转码为"+"号的处理办法,需要的朋友可以参考下
    2023-01-01
  • Android 自定义图片地图坐标功能的实现

    Android 自定义图片地图坐标功能的实现

    最近项目要求实现一个在自定义地图图片上添加坐标信息的功能,类似于在图片做标注的功能,这种功能纠结该如何实现呢?下面小编通过实例代码给大家介绍Android 自定义地图的实现,需要的朋友参考下吧
    2021-07-07
  • Android获取网络图片并显示的方法

    Android获取网络图片并显示的方法

    这篇文章主要为大家详细介绍了Android获取网络图片并显示的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • Android利用ZXing扫描二维码的实例代码解析

    Android利用ZXing扫描二维码的实例代码解析

    这篇文章主要介绍了Android利用ZXing扫描二维码的实例解析,代码简单易懂,非常不错,需要的朋友可以参考下
    2016-12-12
  • Android Studio中生成aar文件及本地方式使用aar文件的方法

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

    这篇文章给大家讲解Android Studio中生成aar文件以及本地方式使用aar文件的方法,也就是说 *.jar 与 *.aar 的生成与*.aar导入项目方法,本文给大家介绍的非常详细,需要的朋友参考下吧
    2017-12-12
  • Android自定义View实现带4圆角或者2圆角的效果

    Android自定义View实现带4圆角或者2圆角的效果

    这篇文章主要介绍了Android自定义View实现带4圆角或者2圆角的效果,本文通过实例代码截图给大家展示的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • Android PopupWindow使用方法小结

    Android PopupWindow使用方法小结

    这篇文章主要为大家详细介绍了Android PopupWindow使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Android实现简易版打地鼠

    Android实现简易版打地鼠

    这篇文章主要为大家详细介绍了Android实现简易版打地鼠,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • Android studio2.3.3升级到3.1.2坑(小记)

    Android studio2.3.3升级到3.1.2坑(小记)

    这篇文章主要介绍了Android studio2.3.3升级3.1.2坑(小记),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09

最新评论