Kotlin警告:在Marker类型的非空接收器上进行了不必要的安全呼叫

SMBiggs

像其他所有人一样,我正在学习Kotlin。我正在努力做对。所以我在类中声明了一个变量:

private lateinit var mLastMarker: Marker

mLastMarker会跟踪我上次使用标记的时间,以便在制作新标记时可以将其删除(Google Maps API)。因此,在添加新标记时,我首先要删除旧标记:

// remove last marker (if it exists)
mLastMarker?.remove()

// add this marker to the map
mLastMarker = mMap.addMarker(markerOptions)

这对我来说很有意义。我想我只会在不为null的情况下执行该remove()函数mLastMarker它会在之后立即设置,因此会remove()在第一个之后每次调用(如果有要删除的内容)。

但是我得到警告。?.标题中将突出显示警告消息。是什么赋予了?我对Kotlin的无效安全性缺少什么?

zsmb13

使用lateinitnull值将永远不会存储在您的媒体资源中。请注意,它的类型Marker不是可为null的Marker?类型-实际上,您不能同时创建可为null和的属性lateinit

通过使用lateinit,您是说编译器不必在任何时候检查可为空性,并且始终希望在读取属性之前,该属性中已经有一个值。如果您在设置之前先阅读过该内容,则不会得到null,而是会抛出异常。如果您给它提供了一个值,则也永远无法将其设置回未初始化状态,因为它不会被接受null为新值。

通常,lateinit如果您想在开始使用某个东西之前对其进行一次初始化则很好,但是由于某种原因在创建该属性时(例如,在构造类时)无法对其进行初始化。

如果您有时需要检查当前是否有值,则使用可为空的属性可能会更好(尽管从技术上讲,您可以检查lateinit变量是否已初始化,但这不是很漂亮)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Kotlin Android Studio-在类型为Intent的可为空的接收器上仅允许安全(?。)或非空声明(!!。)调用。

Swift字典即使进行了优化也很慢:执行不必要的保留/释放?

Kotlin-安全呼叫接线员的链接。不必要的操作员呼叫

在可空接收器类型的arraylist上仅允许安全或非null断言调用

可空接收器上只允许安全 (?.) 或非空断言 (!!.) 调用

不安全使用可为空的接收器类型捆绑?Android应用程式会编译并显示警告,但会立即当机

不必要的命名空间的编译器警告

如何覆盖Kotlin生成的不必要的空检查?

检查用户是否在不安全的路由上进行了身份验证

在Kotlin中省略不必要的类型信息

IntelliJ - 在等于之前进行不必要的“空”检查

不必要的类型转换?

存储器上的硬件错误,并在128个内核上进行了大型仿真

表单数据正在发送,但已在控制器Laravel 5.8上进行了处理

在将可空枚举与它们的基础基元之间进行强制转换时,奇怪的/不必要的编译器输出

禁止在Word 2013 VBA脚本上进行不必要的跳跃/滚动

在两个单独页面上进行不必要的独立会话

验证是否在电话提示后进行了呼叫

不必要的转义字符警告

Cython发出“不必要的”警告

在webRTC呼叫中设置接收器

Kotlin中的接收器类型与Android的“ activityViewModels”不匹配

Kotlin的Float,Int等是否已针对JVM中的内置类型进行了优化?

Kotlin的广播接收器

如果我在在线GitHub编辑器上进行了更改,如何从分支中获取?

在ImageView周围进行不必要的填充

从QFileDialog进行额外的不必要选择

在Linux中进行不必要的交换

在StreamWriter中进行不必要的重复