为什么 Kotlin 不能推断函数的参数和返回类型?

4

代码A来自官方示例项目的末端分支(项目链接)

我认为我可以简化它,所以我编写了代码B和代码C,但事实上它们是错误的,为什么?

顺便提一下,代码D可以编译。

代码A

val onPeopleChanged: (Int) -> Unit = { viewModel.updatePeople(it) }

代码 B

val onPeopleChanged = { viewModel.updatePeople(it) }

代码 C

val onPeopleChanged = {it -> viewModel.updatePeople(it) }

代码 D

val onPeopleChanged = {it:Int -> viewModel.updatePeople(it) }

3
我认为有一个更好的选项是 val onPeopleChanged = viewModel::updatePeople。这行代码可以翻译成:onPeopleChanged 是将 viewModel::updatePeople 赋值给它的一个变量。 - IR42
1个回答

2

我认为第四个例子有点不同。因为它无法推断出哪种类型具有uppercase()函数。在这个例子中,很明显it必须是一个Int,因为viewModel.updatePeople需要一个Int。 - Ivo
我认为@Stefan在第4个例子中是正确的:一个没有明确类型的lambda,无论是在内部、外部还是两个地方都没有,根据定义,它是一个没有参数的函数吗?因此,updatePeople期望一个Int是无关紧要的,因为_it_不是lambda的参数。当您查看IDE的建议时,它确实建议创建一个名为“it”的局部变量,没有“用显式参数替换_it”的选项,并且在大括号上建议创建一个没有参数的匿名函数。 - lukas.j

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接