Lateinit - The illusion of null safety?

Right. In the Android case the example that came to mind for me is a protected method in an abstract subclass of Activity: the descendent onCreate method would be responsible for defining the value of the lateinit var.

Reality is that applying this runtime check on a lifecycle method is almost as good as a compile-time check, since the lifecycle method would be called every time you used the component, so you would fail fast. (Just not quite as fast as a compiler/linter check.)