Android 为什么后期初始化变量不能与Nullable一起使用?
为什么不能对可空变量使用Android 为什么后期初始化变量不能与Nullable一起使用?,android,kotlin,kotlin-lateinit,Android,Kotlin,Kotlin Lateinit,为什么不能对可空变量使用lateinit lateinit var v: String? lateinit修饰符不允许用于可空类型的属性lateinit只是为了避免将来进行空检查,这就是为什么lateinit修饰符不允许用于可空类型的属性 lateinit var v: String? 如果您希望它是可空的,那么只需使用likevar b:String?=空 lateinit var v: String? 通常,声明为具有非空类型的属性必须是 在构造函数中初始化。然而,通常情况下并非如此
lateinit
lateinit var v: String?
lateinit
修饰符不允许用于可空类型的属性lateinit
只是为了避免将来进行空检查,这就是为什么lateinit
修饰符不允许用于可空类型的属性
lateinit var v: String?
如果您希望它是可空的
,那么只需使用likevar b:String?=空
lateinit var v: String?
通常,声明为具有非空类型的属性必须是
在构造函数中初始化。然而,通常情况下并非如此
方便
lateinit var v: String?
例如,可以通过依赖项初始化属性
注入,或在单元测试的设置方法中。在这种情况下,你
无法在构造函数中提供非空初始值设定项,但
仍然希望在引用属性时避免空检查
在类的主体内部
lateinit var v: String?
要处理这种情况,可以使用lateinit
修饰语
lateinit var v: String?
这就是为什么它不支持null
lateinit var v: String?
所以,如果您将任何var指示为lateinit,这意味着编译器在初始化时将忽略它,并将其标记为非空类型,这将在不久的将来初始化,这就是为什么它不支持null类型以避免运行时歧义
lateinit var v: String?
Kotlin的类型系统旨在消除代码中空引用的危险
lateinit var v: String?
因此,两者都代表着妥协。使用时,请确保变量最终将被初始化为非null。如果您甚至不能保证这一点,您可以使用。如果您想创建一个可为null类型的变量,那么您不需要延迟初始化。医生说
lateinit var v: String?
通常,声明为具有非null类型的属性必须在构造函数中初始化。
然而,这通常并不方便。例如,可以通过以下方式初始化属性:
依赖注入,或在单元测试的设置方法中。在这种情况下,您不能提供非空值
构造函数中的初始值设定项,但在引用
类主体内的属性
lateinit var v: String?
因此,当您打算在构造函数之外的某个地方初始化变量,并且希望避免空检查时,可以使用late init。kotlin的主要功能之一是空安全
lateinit var v: String?
默认情况下,它不允许u创建空值。您已经明确定义了var a:String?=空
,如果您不想初始化变量的任何值,则会出现“lateinit”。使用lateinit变量时,您需要预先检查它是否已初始化。如文档中所述,
lateinit
专门处理不可为空的属性:
lateinit var v: String?
通常,必须在构造函数中初始化声明为具有非null类型的属性。然而,这通常并不方便。例如,可以通过依赖项注入或在单元测试的设置方法中初始化属性。在这种情况下,您不能在构造函数中提供非null初始值设定项,但是在引用类主体内的属性时,您仍然希望避免null检查
lateinit var v: String?
此外,如果查看此类lateinit
属性的字节码,您会发现编译器添加了一个代码块,以确保在访问该属性时已初始化该属性。对于lateinit
属性,null
表示属性处于初始但无效的状态
lateinit var v: String?
class WithLateInit {
lateinit var something : String
}
变成
lateinit var v: String?
public final class WithLateInit {
@NotNull
public String something;
@NotNull
public final String getSomething() {
String var10000 = this.something;
if (var10000 == null) { // <- here you can see the lateinit check
Intrinsics.throwUninitializedPropertyAccessException("something");
}
return var10000;
}
//setter
}
public final类WithLateInit{
@NotNull
公共字符串;
@NotNull
公共最终字符串getSomething(){
String var10000=this.something;
if(var10000==null){//我不知道具体细节,但是如果你考虑一下,如果你允许的话,为什么要将它设为lateinit
?只需将它初始化为null
。我知道我会用一些值初始化它,但这将是一个可为null的值,在将该值赋给我们声明的变量时,它将显示一个警告引用文档(和其他答案来源)而不是仅仅复制它。