在Kotlin中创建SAM接口实例时,为什么需要在接口名称后加括号



根据Kotlin关于SAM转换的文档,创建SAM接口实例的语法如下:

val runnable = Runnable { println("This runs in a runnable") }

可以看出,接口名称Runnable后面没有括号。

尽管如此,当我尝试创建OnRatingBarChangeListener接口的实例时,如下所示:

customRatingBar.onRatingBarChangeListener = OnRatingBarChangeListener
{ratingBar: RatingBar, rating: Float, _: Boolean -> if (rating < 0.5f) ratingBar.rating = 0.5f}

安卓工作室在OnRatingBarChangeListener下面加了一条红色的歪歪扭扭的下划线,并说:";函数调用"OnRatingBarChangeListener(…("应为"。实际上,在将括号放在OnRatingBarChangeListener之后,错误就不再出现了,我的应用程序运行得很好:

customRatingBar.onRatingBarChangeListener = OnRatingBarChangeListener()
{ratingBar: RatingBar, rating: Float, _: Boolean -> if (rating < 0.5f) ratingBar.rating = 0.5f}

无论如何,如果Kotlin的文档另有说明,我不明白为什么需要括号。

非常感谢你的帮助!

这是因为你在下一行开始了大括号,所以它不能判断lambda是第一个表达式的一部分。它将lambda解释为下一行的独立表达式。

顺便说一句,使用SAM转换的更方便的方法将允许您跳过写入接口名称:

customRatingBar.setOnRatingBarChangeListener { ratingBar, rating, _ -> 
if (rating < 0.5f) ratingBar.rating = 0.5f
}

最新更新