当我试图理解另一个问题时,我得到了以下代码:

class WorkoutHistory(
    history: Map<Workout, Int> = EnumMap(Workout::class.java)
) {

    private val history: EnumMap<Workout, Int> = EnumMap(history)

    init {
        history.forEach { (workout: Workout, reps: Int?) ->
            doSomething(workout, reps)
        }
    }

    private fun doSomething(workout: Workout, reps: Int) {
        // Do something
    }
}

代码本身没有任何用处,因为我不知道forEach只会迭代当前的值,但它编译和运行得很好,而且没有Android Studio的任何警告.我感到困惑的是,编译器允许我为非空值reps赋予一个可为空的类型,然后在需要非空类型的doSomething函数中将其视为非空.

这只是一个疏忽还是故意的行为?

推荐答案

Kotlin allows non-null values to be typed as nullable because it supports type inference and smart casting. In your code, 100, you're providing a type annotation 101 to the 102 parameter, indicating that it can be nullable. However, Kotlin is also capable of performing smart casts and can detect that 102 can never be 104 inside the lambda passed to 105.

它能做到这一点的原因是historyMap<Workout, Int>,当你遍历这个映射的条目时,你可以保证值的类型是Int,而不是Int?.Kotlin编译器能够理解这一点,并自动将lambda中的reps转换为Int,使其不可空.

Android相关问答推荐

如何完全隐藏的元素堆叠在CardView?

Android Studio中的Kotlin版本不兼容错误:需要元数据1.9.0,但找到1.6.0

格雷德的两个星号是什么意思?非路径

用于小部件泄漏警告的伙伴对象中的Kotlin Lateinit

两首合成曲的喷气背包动画

我正在创建一个简单的连接四个游戏,我需要一个弹出式窗口当你赢了

我怎样才能画一条线在喷气背包组成和有一个自定义的角落?

在 kotlin 上向适配器添加绑定视图功能

expo 上的 socket.io 无法从 Android 连接

Jetpack Compose的val变量不能被重新分配

在 Android Studio 中获取更新版本的 Picasso 库的错误警告消息

Jetpack Compose:如何绘制异形边框?

在 Jetpack Compose 中包装内容

Jetpack Compose - 每次点击按钮都不起作用

如何在屏幕旋转或系统主题更改后将光标移动到 TextField 的末尾并保持键盘显示?

前台服务通知需要几秒钟才能显示

在 Room 中创建一对多关系时,@Relation 类是什么意思?

Kotlin Compose 全局页脚视图

如何使伴奏导航 BottomSheet 完全展开?

如何增加 BottomSheetDialog 的高度以跟随垂直平移