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

更新日期: 2019-12-08 阅读次数: 10665 字数: 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

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式