當匿名物件是 時public,它只是作為物件回傳實作,但是當它是 時private,它作為型別轉換物件回傳。看看下面的 Kotlin 代碼。
private fun foo() = object {
val x: String = "x"
}
fun bar() = object {
val x: String = "x"
}
這段代碼反編譯成Java后,會變成這樣:
private static final <undefinedtype> foo() {
return (<undefinedtype>)(new Object() {
@NotNull
private final String x = "x";
@NotNull
public final String getX() {
return this.x;
}
});
}
@NotNull
public static final Object bar() {
return new Object() {
@NotNull
private final String x = "x";
@NotNull
public final String getX() {
return this.x;
}
};
}
因此,當您嘗試使用代碼時,只有private匿名物件可以訪問x.

那么,為什么每個訪問修飾符都有不同的實作呢?
uj5u.com熱心網友回復:
這就是語言如何定義匿名物件的語意。
匿名物件的型別僅在宣告范圍內可用,當您使用public修飾符時,匿名物件會轉義當前范圍并強制轉換為Any(隱式超型別)。由于Any沒有任何財產x,因此您無法訪問它。另一方面,當您使用private修飾符時,請確保它不會轉義當前范圍。
來自Kotlin 語言規范
常規物件宣告和匿名物件之間的主要區別在于它的型別。匿名物件的型別是一種特殊型別,僅在宣告它的范圍內可用(和可見)。它類似于常規物件宣告的一種型別,但是,由于它不能在宣告范圍之外使用,因此具有一些有趣的效果。
當匿名物件型別的值轉義當前范圍時:
- 如果該型別只有一個宣告的超型別,則它被隱式向下轉換為這個宣告的超型別;
- 如果該型別有多個宣告的超型別,則必須隱式或顯式轉換為范圍外可見的任何合適的型別,否則是編譯時錯誤。
注意:在這種情況下,如果相應的值被宣告為非私有全域或分類器范圍屬性,則立即執行“轉義當前范圍”,因為它們是外部可訪問介面的一部分。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/318002.html
上一篇:動態更新物件陣列中的鍵
