Krótka odpowiedź jest taka, że w przypadku prymitywów zawsze można użyć domyślnie 0
, a domyślnie dopuszcza się typy zerowane null
. Jedynie nie-nullowalne, nieprymitywne typy mogą wymagać, aby pracować wokół systemu bezpieczeństwa typu.
Faktycznie, nie ma potrzeby inicjowania zmiennej w Kotlin tak długo, jak to ma wartość przed pierwszy dostęp i może być statycznie udowodnione. Co oznacza, że kod ten jest całkowicie ważny:
fun main(args: Array<String>) {
var x: Int
val y: Double
x = 0
y = x + 0.1
println("$x, $y")
}
Istnieją jednak (rzadkie) przypadki, w których inicjalizacja nie może zostać udowodniona statycznie. Najczęstszym przypadkiem jest polem klasy, który wykorzystuje każdą formę zastrzyku Zależność:
class Window {
@Inject lateinit parent: Parent
}
Czy mógłbyś wyjaśnić w odpowiedzi, dlaczego 'lateinit Int' nie może być reprezentowany przez typ" Integer "w środowisku wykonawczym, który jest w stanie utrzymać wartość' null', podczas gdy nie została zainicjowana? – Ilya
@Ilya, ponieważ 'Integer' nie jest' int'. Jest to typ pudełkowy i ma znaczenie przy ustawianiu rzeczy natywnie lub poprzez odbicie. –
Myślę więc, że Kotlin zawija typy pierwotne do obiektu (na przykład int do Int). Dlaczego jednak funkcja Int nie może mieć wartości null, ponieważ jest to obiekt? Dlaczego nie możemy zadeklarować parametru jako zerowalnego i opóźnić go? (var x: Int?) – Yao