如果說 lateinit var 和普通的var 有什么區(qū)別的話,可以看這篇文章
定義了 aa 是 lateinit String ,而 bb 是 String?。
class Test {
lateinit var aa: String
var bb: String? = null
}
通過 as 的 kotlin 編譯 tools -- kotlin -- show kotlin bytecode 里面的 decompile
public final class Test {
@NotNull
public String aa;
@Nullable
private String bb;
@NotNull
public final String getAa() {
String var10000 = this.aa;
if (this.aa == null) {
Intrinsics.throwUninitializedPropertyAccessException("aa");
}
return var10000;
}
public final void setAa(@NotNull String var1) {
Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
this.aa = var1;
}
@Nullable
public final String getBb() {
return this.bb;
}
public final void setBb(@Nullable String var1) {
this.bb = var1;
}
}
可以從 java 代碼看出忘巧,聲明時兩者都是String 瓦糕,不過一個被@NotNull 一個被@Nullable 標注
空另,而生成的getAa方法 ,判斷了a是否為空轰绵,如果aa是空的話 會拋出throwUninitializedPropertyAccessException 的異常。而 setAa方法 會判斷 傳入的字符串不為空尼荆,否則拋出參數(shù)為空的異常左腔。throwParameterIsNullException,所以不允許聲明latetinit 的變量不初始化賦值就進行操作捅儒。
擴展方法
class Test {
fun Int.Apple(apple:String){
Log.i("apple",apple)
}
fun a(){
var b=0
b.Apple("a")
}
}
public final class Test {
public final void Apple(int $receiver, @NotNull String apple) {
Intrinsics.checkParameterIsNotNull(apple, "apple");
Log.i("apple", apple);
}
public final void a() {
int b = 0;
this.Apple(b, "a");
}
}
同理擴展方法就是在當前類創(chuàng)建一個方法液样,把擴展對象作為參數(shù)傳入擴展方法。