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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式