为什么Lateinit在对象类型上起作用而在原始类型上不起作用?

时间:2019-04-20 00:26:50

标签: kotlin

This answer says that Object types use the null value on lateinits of Object type。有人可以详细说明吗? “使用空值”是什么意思?

此外,它说“对于原始类型,没有这样的值”-为什么没有

1 个答案:

答案 0 :(得分:5)

在JVM(过去是Kotlin首次使用的平台)上,primitive types与类或对象类型之间存在区别。

它们具有不同的运行时表示形式:基本值直接存储在字段中,该字段只能保存相应的基本类型值之一(例如,#!/bin/bash set -x go build ./cmd/... cd plugins for DIR in `find . ! -path . -type d` do go build -buildmode=plugin $DIR/*.go done truefalse ),并且没有缺失值的特殊表示形式。相比之下,类类型的字段将间接 reference 存储到在堆中分配的实例的间接 reference ,并且类类型的字段可以保存不包含的特殊boolean引用指向任何实例。

Kotlin null属性被编译为单个字段,并且它们在内部使用lateinit值指示该属性尚未初始化。由于原始类型的JVM字段不能具有null值,因此Kotlin不允许使用通常为mapped to Java primitives类型的null属性,因为这将需要不同的表示形式,并且没有另一个答案说,存在可接受的解决方案。

相反,您可以使用by Delegates.notNull()来实现与映射类型相似的行为。