object Foo : CharSequence by Foo.X {
val X = ""
}
produkuje"Zmienna musi być zainicjowany" błąd podczas delegowania do zainicjowany własności
Variable 'X' must be initialized
Ale to jest! Kod powinien być przetłumaczony na coś w rodzaju:
object Foo : CharSequence {
val X = ""
override val length get() = Foo.X.length
override operator fun get(index: Int): Char = Foo.X[index]
override fun subSequence(startIndex: Int, endIndex: Int) = Foo.X.subSequence(startIndex, endIndex)
}
który działa dobrze.
Jaki jest powód błędu i czy istnieje obejście problemu? W prawdziwym inicjowaniu kodu jest nietrywialny i Foo
musi być object
(w rzeczywistości obiektem towarzyszącym), a nie class
.
Odnośnie ostatniego zdania: odpowiedni konstruktor Java stracił swoje główne zastosowanie od wersji 7u6 (jeśli dobrze pamiętam, ale powinno być coś w tym zakresie) i nadal istnieje tam kompatybilność wsteczna. Kotlin nie ma potrzeby go kopiować. –
Tak, zdałem sobie sprawę, że nie ma potrzeby używania tego konstruktora w powyższym kodzie. Jest to odpowiednik: 'obiekt towarzyszący Foo: CharSequence przez" xyzzy "' –