Kotlin 언어에서는 기본적으로 각 변수를 도입 할 때이를 초기화해야합니다. 이를 피하기 위해 lateinit
키워드를 사용할 수 있습니다. 변수가 초기화되기 전에 lateinit
변수를 참조하면 런타임 예외가 발생합니다.왜 Kotlin은 기본 유형의 lateinit을 사용할 수 있습니까?
lateinit
그러나 기본 유형에는 사용할 수 없습니다. 왜 그래야만하지?
Kotlin 언어에서는 기본적으로 각 변수를 도입 할 때이를 초기화해야합니다. 이를 피하기 위해 lateinit
키워드를 사용할 수 있습니다. 변수가 초기화되기 전에 lateinit
변수를 참조하면 런타임 예외가 발생합니다.왜 Kotlin은 기본 유형의 lateinit을 사용할 수 있습니까?
lateinit
그러나 기본 유형에는 사용할 수 없습니다. 왜 그래야만하지?
는 코 틀린는 lateinit
재산권 초기화되지 않았 음을 표시하고 적절한 예외를 발생하도록 null
값을 사용을 할 때 속성에 액세스합니다.
기본 유형에는 해당 값이 없으므로 속성을 초기화되지 않은 것으로 표시하고 lateinit
에서 제공해야하는 진단을 제공 할 방법이 없습니다. (우리는 어떤 종류의 별도 마커를 사용하려고 시도 할 수 있지만 반사를 통해 필드를 초기화 할 때 해당 마커는 업데이트되지 않습니다. 이는 lateinit
의 주요 사용 사례입니다).
따라서 개체 유형의 속성에 대해서만 lateinit
이 지원됩니다.
짧은 대답은 기본으로 0
을 항상 사용할 수 있으며 nullable 유형 null
을 기본값으로 사용할 수 있다는 것입니다. Null을 허용하지 않는 비 프리미티브 유형 만 유형 안전 시스템을 해결하려면 lateinit
이 필요할 수 있습니다.
사실이 전에만큼이 값 을 갖는 한 제 1 액세스를 코 틀린에서 변수를 초기화 할 필요가 없으며 그것을 정적 증명 될 수있다.
fun main(args: Array<String>) {
var x: Int
val y: Double
x = 0
y = x + 0.1
println("$x, $y")
}
을하지만 초기화가 정적으로 입증 할 수없는 (희귀 한) 경우가 있습니다 : 어떤이 코드가 완벽하게 유효을 의미합니다. 가장 일반적인 경우 의존성 주입 임의의 형태를 사용하는 클래스 필드이다
객체 유형에 대해class Window {
@Inject lateinit parent: Parent
}
'lateinit Int'가 런타임시'Integer' 유형으로 표현 될 수없는 이유는 무엇입니까? 초기화되지 않은 상태에서 'null'값을 유지할 수 있습니까? – Ilya
@Ilya 왜냐하면'Integer'는'int'가 아니기 때문입니다. 박스형이며 물건을 기본적으로 또는 반사를 통해 설정할 때 중요합니다. –
그래서, 나는 Kotlin이 원시 타입을 객체 (예를 들어 int에서 Int)로 마무리한다고 생각합니다. 그러나 Int는 객체이므로 null을 유지할 수없는 이유는 무엇입니까? 또한 매개 변수를 nullable 및 lateinit로 선언 할 수없는 이유는 무엇입니까? (var x : Int?) – Yao