В kotlin для lateinit почему он должен использовать «this ::»

#kotlin-lateinit

#kotlin-lateinit

Вопрос:

В документе показан пример для проверки, был ли инициализирован lateinit var:

 println("isInitialized before assignment: "   this::lateinitVar.isInitialized)
lateinitVar = "value"
println("isInitialized after assignment: "   this::lateinitVar.isInitialized)
  

Почему он должен использовать «this::» в качестве своего квалификатора

Ответ №1:

Ответ содержится в декомпилированном байт-коде. При вызове lateinitVar вы получаете доступ к полю с проверкой инициализации:

 println("logProperty: "   lateinitVar)
  

компилируется для:

 StringBuilder var10000 = (new StringBuilder()).append("logProperty: ");
String var10001 = this.lateinitVar;
if (this.lateinitVar == null) {
   Intrinsics.throwUninitializedPropertyAccessException("lateinitVar");
}
String var1 = var10000.append(var10001).toString();
System.out.println(var1);
  

но это:

 println("logProperty: "   this::lateinitVar.isInitialized)
  

компилируется для:

 String var1 = "logProperty: "   (((MyClass)this).lateinitVar != null);
System.out.println(var1);