Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么后期初始化变量不能与Nullable一起使用?_Android_Kotlin_Kotlin Lateinit - Fatal编程技术网

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?
如果您希望它是
可空的
,那么只需使用like
var 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的值,在将该值赋给我们声明的变量时,它将显示一个警告引用文档(和其他答案来源)而不是仅仅复制它。