【问题标题】:Why doesn't Kotlin allow to use lateinit with primitive types?为什么 Kotlin 不允许将 lateinit 与原始类型一起使用?
【发布时间】:2016-08-04 07:40:42
【问题描述】:

在 Kotlin 语言中,默认情况下,我们必须在引入每个变量时对其进行初始化。为避免这种情况,可以使用lateinit 关键字。在初始化之前引用lateinit 变量会导致运行时异常。

lateinit 但是不能与原始类型一起使用。为什么会这样?

【问题讨论】:

    标签: initialization kotlin primitive


    【解决方案1】:

    对于(不可为空的)对象类型,Kotlin 使用 null 值来标记 lateinit 属性尚未初始化,并在访问该属性时引发相应的异常。

    对于原始类型,没有这样的值,因此无法将属性标记为未初始化并提供lateinit 需要提供的诊断。 (我们可以尝试使用某种单独的标记,但在通过反射初始化字段时该标记不会更新,这是lateinit 的主要用例)。

    因此,lateinit 仅支持对象类型的属性。

    【讨论】:

    • 您能否在答案中澄清一下,为什么 lateinit Int 不能在运行时用 Integer 类型表示,它能够在尚未初始化时保持 null 值?
    • 所以,我认为 Kotlin 将原始类型包装为对象(例如 int 到 Int)。但是,为什么 Int 不能保持 null 因为它是一个对象?另外,为什么我们不能将参数声明为可为空并延迟初始化呢? (var x: Int?)
    • @Yao 与 yole 解释的原因相同。基本上,您需要一个未使用的值来标记 var 未初始化的事实。如前所述,原语没有这样的值(原语 var 可以保存的所有值都是有效的)。可空变量也存在同样的问题:所有值,包括空值,都是有效的(您可以使用空值初始化可空变量)。因此,没有未使用的值可以将 var 标记为未初始化。
    • @GustavoMaciel 但是如果我说 lateinit var int: Int? 那么我不明白为什么这不起作用,因为 Kotlin 已经用 Integer 代表 Int? ...
    • @forresthopkinsa 因为lateinit? 有冲突。前者说你有一个变量在初始化后总是有一些值,后者说你有一个变量可能有也可能没有一些值。您不需要?. 或检查lateinit var 的无效性。
    【解决方案2】:

    简短的回答是,对于原语,您始终可以使用 0 作为默认值,并使用可空类型 null 作为默认值。只有不可为空的非原始类型可能需要lateinit 才能绕过类型安全系统。

    其实在 Kotlin 中没有必要初始化一个变量,只要它在第一次访问之前有值,并且可以静态地证明。这意味着这段代码完全有效:

    fun main(args: Array<String>) {
        var x: Int
        val y: Double
    
        x = 0
        y = x + 0.1
    
        println("$x, $y") 
    }
    

    但是有(罕见的)初始化无法静态证明的情况。最常见的情况是使用任何形式的依赖注入的类字段:

    class Window {
        @Inject lateinit parent: Parent
    }
    

    【讨论】:

    • 我认为这有点误导。它表明需要lateinit 的唯一 原因是在编译器不够聪明而无法确定属性是否已初始化时向编译器提供提示。另一个完全有效的用例(这对原语特别有用)是确保在客户端代码在初始化/计算之前尝试访问一个值时急切地抛出一个描述性异常,而不是基于一个默默地做错误的事情默认值为 0 或 false。
    【解决方案3】:

    我认为,在原语的情况下,简单地初始化它以让我说 0 并将简单值保存在内存中而不是存储关于由 lateinit 机制使用的对象可空性的额外信息所花费的资源更少。

    如果不是这样,请纠正我。

    【讨论】:

      猜你喜欢
      • 2019-05-11
      • 1970-01-01
      • 2011-07-21
      • 2016-04-04
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2019-01-03
      • 2013-10-30
      相关资源
      最近更新 更多