根据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
}