Kotlin 变量后面的问号是什么意思

更新日期: 2019-12-08 阅读次数: 971 字数: 393 分类: Kotlin

  • 带问号的代表可以置空的变量
  • 不带问号的代表不可为空的变量

kotlinc-jvm 中测试一下

打开 kotlinc-jvm,输入测试代码

>>> var i: Int = 1                                                                                                                                                                                                   >>> var i: Int = null                                                                                                                                                                                                error: null can not be a value of a non-null type Int                                                                                                                                                                var i: Int = null                                                                                                                                                                                                                 ^          
>>> var i: Int? = null       

从上面 Kotlin 测试代码可见,指定类型的变量在不加问号的情况下,不能初始化为 null。

>>> var j: Int = 1
>>> j = 2
>>> j = null
error: null can not be a value of a non-null type Int
j = null
    ^

不加问号的变量,在初始化之后,无法再次赋值为 null。

为何需要可为空类型的变量

以 Android 应用为例,APP 首页有个图片,在点击按钮后需要切换另一个图片。为了优化性能需要将ImageView 对象定义为 Activity Class 的属性,然后在 onCreate 里进行绑定。在 onCreate 之前,ImageView 对象没有被赋值,所以应该是 null。理论应该是

var homeImage: ImageView? = null

但是这样就失去了不可为空类型存在的意义,因为 onCreate 之后,ImageView 就不应该为空。

lateinit var homeImage: ImageView

合理的做法是,使用 lateinit。

error: 'lateinit' modifier is not allowed on properties of primitive types

>>> lateinit var k: Int
error: 'lateinit' modifier is not allowed on properties of primitive types
lateinit var k: Int
^

但是需要注意的是,lateinit 不能使用在基础类型上,基础类型包括

  • byte, short, int, long
  • float, double
  • char
  • boolean

爱评论不评论

近期节日

2020年04月07日 世界卫生日
2020年04月11日 世界帕金森病日
2020年04月19日 谷雨
2020年04月21日 复活节
2020年04月22日 世界地球日
2020年04月23日 世界读书日
2020年04月26日 知识产权日
2020年04月30日 佛诞
2020年04月30日 全国交通安全反思日
2020年05月01日 国际劳动节
2020年05月04日 五四青年节
2020年05月05日 立夏
查看更多节日