private lateinit var mLastMarker: Marker
Объявляет экземпляр типа Marker
.
private lateinit var mLastMarker: Marker?
Объявляет экземпляр типа nullable Marker
.
Следовательно, в вашем случае проверка нулевой безопасности ?
является избыточной, поскольку mLastMarker
не может быть нулевым.
Итак:
mLastMarker?.remove()
Может быть:
mLastMarker.remove()
Смущение, вероятно, вызвано тем, что вы используете lateinit
, поэтому я предполагаю, что вы поняли, что значение может быть null
. Это немного странно, потому что для компилятора значение не может быть null
, но, если вы не назначите значение lateinit
где-то перед тем, как получите к нему доступ, на самом деле оно будет "по существу" null
(не совсем, но концептуально), и доступ к нему может привести к UninitializedPropertyAccessException
Иногда вам действительно нужно свойство lateinit
, но чаще всего вы можете его избежать. Я бы посоветовал взглянуть на ваш код и посмотреть, действительно ли вам нужно, чтобы он был lateinit
, или вы можете создать его экземпляр заранее, или, альтернативно, именно там, где он требуется.